<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ankit-brijwasi</title>
    <description>The latest articles on DEV Community by ankit-brijwasi (@ankitbrijwasi).</description>
    <link>https://dev.to/ankitbrijwasi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F353210%2F1c03d3af-6092-430e-9434-9bed2aa0d9da.jpeg</url>
      <title>DEV Community: ankit-brijwasi</title>
      <link>https://dev.to/ankitbrijwasi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ankitbrijwasi"/>
    <language>en</language>
    <item>
      <title>Generate API docs under a minute in Django</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Sat, 26 Aug 2023 18:09:36 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/generate-api-docs-under-a-minute-in-django-31pf</link>
      <guid>https://dev.to/ankitbrijwasi/generate-api-docs-under-a-minute-in-django-31pf</guid>
      <description>&lt;p&gt;Greetings everyone!&lt;/p&gt;

&lt;p&gt;In this post, I'll be telling you, how we can generate API docs for any Django rest framework project, in less then a minute!&lt;/p&gt;

&lt;p&gt;If that sounds interesting, follow along😁&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Installing the drf_yasg package
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: you may find other packages for auto generating your API docs, but most of them are outdated and not maintained, that's why I'll recommend you to stick with &lt;code&gt;drf_yasg&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;let's start by installing the &lt;code&gt;drf_yasg&lt;/code&gt; package into your local development environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;drf_yasg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the package is installed, include it to the &lt;code&gt;INSTALLED_APPS&lt;/code&gt; array, in your &lt;code&gt;settings.py&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# settings.py
&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# other packages
&lt;/span&gt;    &lt;span class="s"&gt;'drf_yasg'&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this drf_yasg will be installed in your django project&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Update your root urls file
&lt;/h3&gt;

&lt;p&gt;Once the package is installed, open the root &lt;code&gt;urls.py&lt;/code&gt; file of your project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/mydjangoproject
  |-mydjangoproject
  |   |-__init__.py
  |   |-wsgi.py
  |   |-asgi.py
  |   |-urls.py     &lt;span class="c"&gt;# &amp;lt;---- This file&lt;/span&gt;
  |   |-settings.py
  |-app1
  |-app2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it is opened, update it with following code-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# existing imports
&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;# import get_schema_view and openapi from drf_yasg
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;drf_yasg.views&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_schema_view&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;drf_yasg&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openapi&lt;/span&gt;

&lt;span class="c1"&gt;# create the schema view
&lt;/span&gt;&lt;span class="n"&gt;schema_view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_schema_view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;openapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"My Django APIs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;default_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Creating API docs was never this easy!!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# include the schema_view in the urlpatterns
&lt;/span&gt;&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="c1"&gt;# existing routes
&lt;/span&gt;   &lt;span class="p"&gt;...&lt;/span&gt;

   &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'docs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema_view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'swagger'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
   &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'redoc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema_view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'redoc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it's done, now open &lt;a href="http://127.0.0.1:8000/docs"&gt;127.0.0.1:8000/docs&lt;/a&gt; route and you'll see the swagger page with all of your apis!&lt;/p&gt;

&lt;p&gt;If you want the redoc version, just go to the &lt;a href="http://127.0.0.1:8000/redoc"&gt;127.0.0.1:8000/redoc&lt;/a&gt; page and redoc api docs will appear there!&lt;/p&gt;

&lt;h4&gt;
  
  
  Swagger Page
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qm9IGuLH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bnxghca90x3mdjc6dgy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qm9IGuLH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bnxghca90x3mdjc6dgy.gif" alt="Swagger Page" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any problems mention them on the comments😉&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>django</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>Mastering Web Navigation: How to Save Time and Effort with Text-Fragments</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Wed, 26 Jul 2023 04:28:33 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/mastering-web-navigation-how-to-save-time-and-effort-with-text-fragments-4plb</link>
      <guid>https://dev.to/ankitbrijwasi/mastering-web-navigation-how-to-save-time-and-effort-with-text-fragments-4plb</guid>
      <description>&lt;p&gt;Recently, I was reading an article, and it was very long! The annoying part was that, everytime I came back, I had to go through the contents again and again, until I found an intresting trick to solve this on the web.😁&lt;/p&gt;

&lt;p&gt;Follow along with me, If you are also facing the same issue&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Solution
&lt;/h3&gt;

&lt;p&gt;A hack to solve this problem, that I found is by using the, text-fragments feature that most of the modern web browsers now a days support&lt;/p&gt;

&lt;p&gt;Syntax-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com/some-blog#:~:text=&amp;lt;TEXT YOU WANT TO SAVE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If there are spaces, then denote them using %20&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Demo
&lt;/h4&gt;

&lt;p&gt;visit this &lt;a href="https://medium.com/neurobit-technologies/creating-dark-theme-using-react-hooks-and-context-in-material-ui-1f42af330913#:~:text=Below%20is%20a%20gif"&gt;page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When it opens, you'll see that the browser automatically, highlights and scrolls to the position where the text, &lt;strong&gt;&lt;code&gt;Below is a gif&lt;/code&gt;&lt;/strong&gt; is present&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PS: While most websites support this feature, it's essential to bear in mind that a few might not be optimized yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy Browsing! 😇&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>MongoDB Atlas Hackathon 2022 on DEV</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Thu, 08 Dec 2022 23:29:30 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/mongodb-atlas-hackathon-2022-on-dev-15im</link>
      <guid>https://dev.to/ankitbrijwasi/mongodb-atlas-hackathon-2022-on-dev-15im</guid>
      <description>&lt;h2&gt;
  
  
  What We built
&lt;/h2&gt;

&lt;p&gt;Hello and welcome to our project for this hackathon! Our project is called FastPanel, and it is a Django inspired admin panel for FARM stack.&lt;/p&gt;

&lt;p&gt;It is highly customizable and fully integratable with any project that uses FARM stack as its core.&lt;/p&gt;

&lt;p&gt;For Demonstrating FastPanel, we have created a wrapper project on top of it, called &lt;strong&gt;DevDuels&lt;/strong&gt; - A real-time multiplayer coding battleground!&lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission:
&lt;/h3&gt;

&lt;p&gt;About Real-time&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;FastPanel app page&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsluu8ldqq9c3hfygh97v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsluu8ldqq9c3hfygh97v.png" alt="FastPanel App Page" width="800" height="433"&gt;&lt;/a&gt;&lt;br&gt;
FastPanel app models page&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw22yyt58yoo5wcf3hfwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw22yyt58yoo5wcf3hfwp.png" alt="FastPanel App Models Page" width="800" height="433"&gt;&lt;/a&gt;&lt;br&gt;
FastPanel list document&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmugn8skdttabcpf27zjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmugn8skdttabcpf27zjy.png" alt="FastPanel list document" width="800" height="432"&gt;&lt;/a&gt;&lt;br&gt;
FastPanel create a new document&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb94m60keuvjyqpubinri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb94m60keuvjyqpubinri.png" alt="FastPanel create a new document" width="800" height="432"&gt;&lt;/a&gt;&lt;br&gt;
FastPanel update a document&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpntbv8c6tbfc3vbs03kt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpntbv8c6tbfc3vbs03kt.png" alt="FastPanel update a document" width="800" height="431"&gt;&lt;/a&gt;&lt;br&gt;
FasPanel Delete a document&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bcxxb48jnn01c7ltdyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bcxxb48jnn01c7ltdyu.png" alt="FasPanel Delete a document" width="800" height="432"&gt;&lt;/a&gt;&lt;br&gt;
FastPanel Profile Page&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogf6bk3rjqoo4zed489d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogf6bk3rjqoo4zed489d.png" alt="FastPanel Profile Page" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;DevDuels&lt;/p&gt;

&lt;p&gt;DevDuels user registration&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbjfeoolcvj9haaloldl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbjfeoolcvj9haaloldl.png" alt="DevDuels User Registration" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
DevDuels create event&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzp443slqtmx03yunxjw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzp443slqtmx03yunxjw.png" alt="DevDuels create event" width="800" height="431"&gt;&lt;/a&gt;&lt;br&gt;
DevDuels join a event&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fornnsqe16cbodv0r77aw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fornnsqe16cbodv0r77aw.png" alt="DevDuels join a event" width="800" height="431"&gt;&lt;/a&gt;&lt;br&gt;
DevDuels event info&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fziz54pbaag95cw7gtsop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fziz54pbaag95cw7gtsop.png" alt="DevDuels event info" width="800" height="432"&gt;&lt;/a&gt;&lt;br&gt;
DevDuels coding ground&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fib8rgrmj9ajdrpccn4vm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fib8rgrmj9ajdrpccn4vm.png" alt="DevDuels coding ground" width="800" height="433"&gt;&lt;/a&gt;&lt;br&gt;
DevDuels scoreboard&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99hpexsr1paq017qhu1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99hpexsr1paq017qhu1l.png" alt="DevDuels scoreboard" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;FastPanel is a library built using, &lt;strong&gt;preact&lt;/strong&gt;, &lt;strong&gt;FastAPI&lt;/strong&gt;, and &lt;strong&gt;MongoDB&lt;/strong&gt;. It has a seamless integration with any FARM stack project, to demonstrate FastPanel we have created a wrapper project on top of it, which is called, &lt;strong&gt;DevDuels&lt;/strong&gt;, As the name suggests this is a simple platform where dev's can compete with each other, in a coding battleground.&lt;/p&gt;

&lt;p&gt;DevDuels uses, &lt;code&gt;changeStreams&lt;/code&gt; to send real-time database updates to the its frontend client which is built using react.&lt;/p&gt;
&lt;h4&gt;
  
  
  Tech-Stack's used
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;FastPanel&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB as its primary DB&lt;/li&gt;
&lt;li&gt;FastAPI as the core backend framework, to create APIs&lt;/li&gt;
&lt;li&gt;pReact as the frontend client, to consume the APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DevDuels&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB as its primary DB&lt;/li&gt;
&lt;li&gt;MongoDB change streams to send real-time updates to the backend server&lt;/li&gt;
&lt;li&gt;FastAPI as the core backend framework, to create APIs&lt;/li&gt;
&lt;li&gt;React as the frontend client, to consume the APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  Application Structure
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k45ohs9gxytgk3hjfcq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k45ohs9gxytgk3hjfcq.jpg" alt="FastPanel &amp;amp; DevDuels arch" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ankit-brijwasi" rel="noopener noreferrer"&gt;
        ankit-brijwasi
      &lt;/a&gt; / &lt;a href="https://github.com/ankit-brijwasi/fastPanel" rel="noopener noreferrer"&gt;
        fastPanel
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Django inspired admin panel for FastAPI and MongoDB developers
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;FastPanel: The Modern Admin Panel for FastAPI and MongoDB Developers&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Meet FastPanel – the new-age dashboard crafted for developers using FastAPI and MongoDB, with a user-friendly interface powered by pReact.&lt;/p&gt;
&lt;p&gt;FastPanel steps up as the modern twist on the classic Django admin panel. It's tailored for folks diving into FastAPI and MongoDB, offering a smooth experience for managing your projects.&lt;/p&gt;
&lt;p&gt;Think of it as your go-to tool for streamlining your work, letting you focus on what really counts – creating awesome apps.&lt;/p&gt;
&lt;p&gt;So, get ready to explore the future of admin panels with FastPanel.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Build and install the FastPanel library&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Build the library using-&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ python setup.py sdist&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Install the library&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ pip install dist/fastpanel-1.x.x.tar.gz&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;FYI: pip version will be released soon!😉😁&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Configure FastPanel into your application&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Create the &lt;code&gt;fastpanel.yaml&lt;/code&gt; configuration file, here's the general format for that-&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;secret_key&lt;/span&gt;: &lt;span class="pl-s"&gt;&amp;lt;MY SECRET KEY&amp;gt; &lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; enter the secret key for your&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ankit-brijwasi/fastPanel" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ankit-brijwasi" rel="noopener noreferrer"&gt;
        ankit-brijwasi
      &lt;/a&gt; / &lt;a href="https://github.com/ankit-brijwasi/devduels-frontend" rel="noopener noreferrer"&gt;
        devduels-frontend
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;DevDuels&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;React frontend for connecting with the devduels backend&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Run the server&lt;/h1&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install all the dependencies using,&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ npm install&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Run the server using,&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ npm start&lt;/pre&gt;

&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ankit-brijwasi/devduels-frontend" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/navdeepm20" rel="noopener noreferrer"&gt;
        navdeepm20
      &lt;/a&gt; / &lt;a href="https://github.com/navdeepm20/fast-pannel" rel="noopener noreferrer"&gt;
        fast-pannel
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This is the admin panel designed in Preact to be used with FastApi with its wrapper. This fulfills the need of a modern admin panel required for FastApi.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;FastPanel&lt;/h1&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;A modern admin panel that power up the FastApi Projects to scale without thinking about an admin pannel. This project is combination of two modules the frontend and the backend and support project with MongoDb as the primary database. The backend project can be found here &lt;a href="https://github.com/ankit-brijwasi/fastPanel" rel="noopener noreferrer"&gt;https://github.com/ankit-brijwasi/fastPanel&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Requirements&lt;/h1&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Major Dependencies&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Preact&lt;/li&gt;
&lt;li&gt;React Router Dom&lt;/li&gt;
&lt;li&gt;Material UI&lt;/li&gt;
&lt;li&gt;For more refer to package.json.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Project Information&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;  
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f1f6bf6b15e6ab06fca76257ad6514a068189d7e376be4e5ace9dfcad482dce8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c616e67756167652d4a6176617363726970742d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/f1f6bf6b15e6ab06fca76257ad6514a068189d7e376be4e5ace9dfcad482dce8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c616e67756167652d4a6176617363726970742d627269676874677265656e"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d398e15c7b95bdbad2e6e46236022dd4c1518f62a1b6b40d54705c8e59d417f5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506c6174666f726d2d5765622d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/d398e15c7b95bdbad2e6e46236022dd4c1518f62a1b6b40d54705c8e59d417f5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506c6174666f726d2d5765622d626c7565"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9c89a358535991465b57936329f806dbe45d86027b2466b234d56f247f6a7464/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4672616d65776f726b2d5072656163742d626c756576696f6c6574"&gt;&lt;img src="https://camo.githubusercontent.com/9c89a358535991465b57936329f806dbe45d86027b2466b234d56f247f6a7464/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4672616d65776f726b2d5072656163742d626c756576696f6c6574"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ddfb6839b8b1b9941c7c30e77860a1dff3686ba296042aac93d801f7853cdd41/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657273696f6e2d302e302e312d666636396234"&gt;&lt;img src="https://camo.githubusercontent.com/ddfb6839b8b1b9941c7c30e77860a1dff3686ba296042aac93d801f7853cdd41/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56657273696f6e2d302e302e312d666636396234"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;CLI Commands&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; install dependencies&lt;/span&gt;
npm install

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; serve with hot reload at localhost:8080&lt;/span&gt;
npm run dev

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; build for production with minification&lt;/span&gt;
npm run build

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; test the production build locally&lt;/span&gt;
npm run serve

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; run tests with jest and enzyme&lt;/span&gt;
npm run &lt;span class="pl-c1"&gt;test&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;For detailed explanation on how things work, checkout the &lt;a href="https://github.com/developit/preact-cli/blob/master/README.md" rel="noopener noreferrer"&gt;CLI Readme&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/navdeepm20/fast-pannel" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;MIT License&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;As more and more people are using microservice architecture in their projects, the demand for NoSQL databases like MongoDB is increasing at an astounding rate, but the old and matured frameworks like Django don't have a built-in support for them, and needs manual configuration!&lt;/p&gt;

&lt;p&gt;As a result, nowadays frameworks like FastAPI are becoming more and more popular, Which is good, but there are some parts of Django which are super helpful for developers, like its built-in Admin Panel, which is customizable down to its core!&lt;/p&gt;

&lt;p&gt;Taking an inspiration from this, me and my friend &lt;a class="mentioned-user" href="https://dev.to/navdeepm20"&gt;@navdeepm20&lt;/a&gt; , decided that, we'll be building a new admin panel, which can support the new and modern frameworks and databases, like FastAPI &amp;amp; MongoDB.&lt;/p&gt;

&lt;h3&gt;
  
  
  How we built it
&lt;/h3&gt;

&lt;p&gt;While building the application, We learned a lot about mongodb, things like, &lt;code&gt;changestreams&lt;/code&gt;, indexes, relationships, and etc.&lt;/p&gt;

&lt;p&gt;The most fascinating feature for me personally was the &lt;code&gt;changesteams&lt;/code&gt;, and I realized just how useful mongodb is, in a microservice architecture.&lt;/p&gt;

&lt;p&gt;Overall, It was a very fun experience working with mongodb and its python connector &lt;code&gt;motor&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;p&gt;Google, Stackoverflow, github issues, mongodb docs, fastapi docs, mui docs, and pReact docs!&lt;/p&gt;

&lt;h3&gt;
  
  
  Contributors
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__353210"&gt;
    &lt;a href="/ankitbrijwasi" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F353210%2F1c03d3af-6092-430e-9434-9bed2aa0d9da.jpeg" alt="ankitbrijwasi image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/ankitbrijwasi"&gt;ankit-brijwasi&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/ankitbrijwasi"&gt;Backend developer at Neurobit Innovations, India who loves to create inspiring #code and cool shortcuts.
Python and JS ❤.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag__user ltag__user__id__534624"&gt;
    &lt;a href="/navdeepm20" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F534624%2F3e7f3f6b-a7ef-4e3d-b57b-03c968cd2b9e.jpg" alt="navdeepm20 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/navdeepm20"&gt;Navdeep Mishra&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/navdeepm20"&gt;💻 Software Engineer  | #️⃣ Full Stack | 😎Tech Enthusiast | ❤️ Music 🔥&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>Connect FastAPI &amp; Golang services using gRPC</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Sun, 06 Nov 2022 11:27:09 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/connect-fastapi-golang-services-using-grpc-4k3d</link>
      <guid>https://dev.to/ankitbrijwasi/connect-fastapi-golang-services-using-grpc-4k3d</guid>
      <description>&lt;p&gt;Hello Devs! Recently I started learning Protocol buffers &amp;amp; gRPC, and gotta tell you, this tech is amazing!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;THIS POST REQUIRES A PRIOR KNOWLEDGE OF GRPC, GOLANG, AND PYTHON&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Follow along with this post to get a hands-on demo on how to establish communication between different microservices that are running on different codebases using gRPC.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find the code for this post &lt;a href="https://github.com/ankit-brijwasi/grpc-demo-with-go-and-fastapi" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Directory Structure
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi-and-golang-grpc-demo
|-fastapi
    |-app
    |-env
    |-requirements.txt
|-protobufs
    |-auth.proto
|-main.go
|-Readme.md
|-go.mod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Create the auth protobuf file
&lt;/h2&gt;

&lt;p&gt;Open the &lt;code&gt;auth.proto&lt;/code&gt; file on your favourite code editor, and add the following code to it&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight protobuf"&gt;&lt;code&gt;

&lt;span class="na"&gt;syntax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"proto3"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;option&lt;/span&gt; &lt;span class="na"&gt;go_package&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"auth.utils/auth"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="na"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int64&lt;/span&gt; &lt;span class="na"&gt;user_id&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt;  &lt;span class="na"&gt;token_valid&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;service&lt;/span&gt; &lt;span class="n"&gt;Auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;Authenticate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthenticationRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthenticationResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Read more about protocol buffers &lt;a href="https://developers.google.com/protocol-buffers/docs/overview" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Add the Go service
&lt;/h2&gt;

&lt;p&gt;1. Initialize the go application with&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;go mod init auth-ms


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2. Generate the gRPC code&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;protoc &lt;span class="nt"&gt;--go_out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--go-grpc_out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; protobufs/auth.proto


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3. Update the dependencies&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;go mod tidy


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;4. Let's create our gRPC server for golang, add the following code in the &lt;code&gt;main.go&lt;/code&gt; file&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"context"&lt;/span&gt;
    &lt;span class="s"&gt;"flag"&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net"&lt;/span&gt;

    &lt;span class="n"&gt;pb&lt;/span&gt; &lt;span class="s"&gt;"auth-ms/auth.utils/auth"&lt;/span&gt;

    &lt;span class="s"&gt;"google.golang.org/grpc"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;50051&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"port to run the server on"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnimplementedAuthServer&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// extend the rpc service created in auth.proto&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetToken&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received: %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// add some logic to verify token&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationResponse&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;UserId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TokenValid&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;lis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unable to start the server on port"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;grpc_server&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;grpc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisterAuthServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grpc_server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Started server at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Addr&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;grpc_server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lis&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Failed to start server at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Addr&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;5. Start the gRPC server and keep it opened&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;go run main.go &lt;span class="nt"&gt;-port&lt;/span&gt; 8080
2022/11/06 16:26:39 Started server at &lt;span class="o"&gt;[&lt;/span&gt;::]:8080


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Add the FastAPI Service
&lt;/h2&gt;

&lt;p&gt;1. Install the dependencies&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn grpcio-tools~&lt;span class="o"&gt;=&lt;/span&gt;1.30


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2. Generate the gRPC code&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ./fastapi/app/
&lt;span class="nv"&gt;$ &lt;/span&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; grpc_tools.protoc &lt;span class="nt"&gt;-I&lt;/span&gt; ../protobufs &lt;span class="nt"&gt;--python_out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--grpc_python_out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; ../protobufs/auth.proto


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3. Create the FastAPI server&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;grpc&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;compiled_pb.auth_pb2_grpc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuthStub&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;compiled_pb.auth_pb2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuthenticationRequest&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/token/verify/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verify_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# gRPC client for making RPC calls to the server
&lt;/span&gt;    &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;grpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insecure_channel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost:8080&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AuthStub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_token_valid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token_valid&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;4. Start the FastAPI sever&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

uvicorn main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000 &lt;span class="nt"&gt;--reload&lt;/span&gt;
INFO:     Will watch &lt;span class="k"&gt;for &lt;/span&gt;changes &lt;span class="k"&gt;in &lt;/span&gt;these directories: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'/home/ankit/practice/golang_gRPC/fastapi/app'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
INFO:     Uvicorn running on http://127.0.0.1:8000 &lt;span class="o"&gt;(&lt;/span&gt;Press CTRL+C to quit&lt;span class="o"&gt;)&lt;/span&gt;
INFO:     Started reloader process &lt;span class="o"&gt;[&lt;/span&gt;8652] using StatReload
INFO:     Started server process &lt;span class="o"&gt;[&lt;/span&gt;8654]
INFO:     Waiting &lt;span class="k"&gt;for &lt;/span&gt;application startup.
INFO:     Application startup complete.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now, go to, &lt;a href="//http:127.0.0.1:8000/docs"&gt;http:127.0.0.1:8000/docs&lt;/a&gt; and hit the, &lt;code&gt;/token/verify/&lt;/code&gt; route.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4p9pmonrwp18zatpnj4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4p9pmonrwp18zatpnj4.jpg" alt="FastAPI server"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VOILÀ, As soon as you hit the api request, there will be an internal RPC call to the go gRPC server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ssgrzgvx2lffuc0yj03.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ssgrzgvx2lffuc0yj03.jpg" alt="golang gRPC server"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding!😊😇&lt;/p&gt;

</description>
      <category>python</category>
      <category>go</category>
      <category>grpc</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Ghost Cloud</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Tue, 30 Aug 2022 00:00:00 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/ghost-cloud-3fmc</link>
      <guid>https://dev.to/ankitbrijwasi/ghost-cloud-3fmc</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;Ghost Cloud is an online platform for sharing files, and its a cloud-first microservices application. Once someone uploads a file it becomes publicly available in the platform and other persons can also view and save it. With the help of redis, tasks like file compression and uploading are completely asynchronous and Event Driven for the user.&lt;/p&gt;

&lt;p&gt;The application consists of 5-tier microservices. That are performing various tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Inspired by Microservice Mavens&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqdcxfbalwkor465x085.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqdcxfbalwkor465x085.jpg" alt="Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;p&gt;| Home&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdst2yfmv54o1vi233y9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdst2yfmv54o1vi233y9g.png" alt="Home Page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;| View File&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd69jevvvnqocjtepjh3t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd69jevvvnqocjtepjh3t.jpg" alt="View File"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;| Save File Page&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh83u8vsfomhqdnx5ptco.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh83u8vsfomhqdnx5ptco.jpg" alt="Save file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;| Upload File&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faujlo3bg1bedqaogj7a9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faujlo3bg1bedqaogj7a9.jpg" alt="Upload file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Language Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Javascript&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;

&lt;p&gt;Find the code here-&lt;br&gt;
&lt;a href="https://github.com/ankit-brijwasi/ghost-cloud" rel="noopener noreferrer"&gt;https://github.com/ankit-brijwasi/ghost-cloud&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  YouTube Explaination
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://youtu.be/CI8He_0s2RI" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r1qhgfj41q1mk2oy3fu.png" alt="YouTube Video"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Collaborators
&lt;/h3&gt;

&lt;p&gt;Solo by &lt;a class="mentioned-user" href="https://dev.to/ankitbrijwasi"&gt;@ankitbrijwasi&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More Information about Redis Stack
&lt;/h2&gt;

&lt;p&gt;Here some resources to help you quickly get started using Redis Stack. If you still have questions, feel free to ask them in the &lt;a href="https://discord.gg/redis" rel="noopener noreferrer"&gt;Redis Discord&lt;/a&gt; or on &lt;a href="https://twitter.com/redisinc" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign up for a &lt;a href="https://redis.info/try-free-dev-to" rel="noopener noreferrer"&gt;free Redis Cloud account using this link&lt;/a&gt; and use the &lt;a href="https://developer.redis.com/create/rediscloud" rel="noopener noreferrer"&gt;Redis Stack database in the cloud&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Based on the language/framework you want to use, you will find the following client libraries:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/redis/redis-om-dotnet" rel="noopener noreferrer"&gt;Redis OM .NET (C#)&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Watch this &lt;a href="https://www.youtube.com/watch?v=ZHPXKrJCYNA" rel="noopener noreferrer"&gt;getting started video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow this &lt;a href="https://redis.io/docs/stack/get-started/tutorials/stack-dotnet/" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/redis/redis-om-node" rel="noopener noreferrer"&gt;Redis OM Node (JS)&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Watch this &lt;a href="https://www.youtube.com/watch?v=KUfufrwpBkM" rel="noopener noreferrer"&gt;getting started video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow this &lt;a href="https://redis.io/docs/stack/get-started/tutorials/stack-node/" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/redis/redis-om-python" rel="noopener noreferrer"&gt;Redis OM Python&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Watch this &lt;a href="https://www.youtube.com/watch?v=PPT1FElAS84" rel="noopener noreferrer"&gt;getting started video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow this &lt;a href="https://redis.io/docs/stack/get-started/tutorials/stack-python/" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/redis/redis-om-spring" rel="noopener noreferrer"&gt;Redis OM Spring (Java)&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Watch this &lt;a href="https://www.youtube.com/watch?v=YhQX8pHy3hk" rel="noopener noreferrer"&gt;getting started video&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow this &lt;a href="https://redis.io/docs/stack/get-started/tutorials/stack-spring/" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The above videos and guides should be enough to get you started in your desired language/framework. From there you can expand and develop your app. Use the resources below to help guide you further:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://redis.info/devhub" rel="noopener noreferrer"&gt;Developer Hub&lt;/a&gt; - The main developer page for Redis, where you can find information on building using Redis with sample projects, guides, and tutorials.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redis.io/docs/stack/" rel="noopener noreferrer"&gt;Redis Stack getting started page&lt;/a&gt; - Lists all the Redis Stack features. From there you can find relevant docs and tutorials for all the capabilities of Redis Stack.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redis.com/rediscover/" rel="noopener noreferrer"&gt;Redis Rediscover&lt;/a&gt; - Provides use-cases for Redis as well as real-world examples and educational material&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redis.info/redisinsight" rel="noopener noreferrer"&gt;RedisInsight - Desktop GUI tool&lt;/a&gt; - Use this to connect to Redis to visually see the data. It also has a CLI inside it that lets you send Redis CLI commands. It also has a profiler so you can see commands that are run on your Redis instance in real-time&lt;/li&gt;
&lt;li&gt;Youtube Videos

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://redis.info/youtube" rel="noopener noreferrer"&gt;Official Redis Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=LaiQFZ5bXaM&amp;amp;list=PL83Wfqi-zYZFIQyTMUU6X7rPW2kVV-Ppb" rel="noopener noreferrer"&gt;Redis Stack videos&lt;/a&gt; - Help you get started modeling data, using Redis OM, and exploring Redis Stack&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=mUNFvyrsl8Q" rel="noopener noreferrer"&gt;Redis Stack Real-Time Stock App&lt;/a&gt; from Ahmad Bazzi&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=DOIWQddRD5M" rel="noopener noreferrer"&gt;Build a Fullstack Next.js app&lt;/a&gt; with Fireship.io&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=Cy9fAvsXGZA" rel="noopener noreferrer"&gt;Microservices with Redis Course&lt;/a&gt; by Scalable Scripts on freeCodeCamp&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Happy Coding&lt;/p&gt;

&lt;p&gt;Cheers&lt;/p&gt;

</description>
      <category>redishackathon</category>
      <category>python</category>
    </item>
    <item>
      <title>Have you tried the unpack operator in python?</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Sun, 30 Jan 2022 19:13:23 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/have-you-tried-the-unpack-operator-in-python-1g0k</link>
      <guid>https://dev.to/ankitbrijwasi/have-you-tried-the-unpack-operator-in-python-1g0k</guid>
      <description>&lt;p&gt;The one thing, which I love in Python is its unpack operator (* and **). This operator can be used with any iterable(list, dictionary, tuple, etc). It makes the code very elegant, adds performance to the code and I can do a ton of things using it.&lt;/p&gt;

&lt;p&gt;Here are some of my use cases for the unpack operator-&lt;/p&gt;

&lt;p&gt;1. Pass function parameters-&lt;/p&gt;

&lt;p&gt;Often times, it happens that, the function has too much parameters with long names, and passing each value to parameter makes the code harder to read.&lt;/p&gt;

&lt;p&gt;To tackle this problem you can use unpack operator(* if there are positional arguments or ** if there are keyword arguments)&lt;/p&gt;

&lt;p&gt;example-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_func1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="s"&gt;'''
  args is a tuple, so you can use indexing to get the values
  kwargs is a dict, so you can use, kwargs.get(param_name) to access the value
  '''&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;positional_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keyword_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;'arg1'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'arg2'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'arg3'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;my_func1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;positional_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;keyword_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this way you can make your code more readable, and if the values for the function are static then, you can import them from a seperate file.&lt;/p&gt;

&lt;p&gt;2. Update list or dictionary-&lt;/p&gt;

&lt;p&gt;Using Unpack operator we can update a list or dict without using any inbuilt function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;list1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;dict1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'b'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# add a new element
&lt;/span&gt;&lt;span class="n"&gt;list1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;dict1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dict1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dict1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3. Merge a list or dictionary-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;list1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;list2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;list3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;dict1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'b'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;dict2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;dict3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dict1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dict2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4. Split an iterable into multiple parts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;my_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello devs!"&lt;/span&gt;

&lt;span class="n"&gt;sub_str1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sub_str2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_string&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_str1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_str2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading this post&lt;br&gt;
Have an awesome day!😇&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Running Docker Containers created using docker-compose</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Wed, 20 Oct 2021 15:37:05 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/running-docker-containers-created-using-docker-compose-4lao</link>
      <guid>https://dev.to/ankitbrijwasi/running-docker-containers-created-using-docker-compose-4lao</guid>
      <description>&lt;p&gt;So, Recently I was experimenting with docker, and it occured to me that, how can I access the docker containers that are created using, &lt;code&gt;docker-compose&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;when I used, the &lt;code&gt;docker ps -a&lt;/code&gt; command, I can see all my containers that are created by docker-compose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnb7ywiycnvuzjsbznan4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnb7ywiycnvuzjsbznan4.png" alt="docker ps -a result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But when I tried to run a container, It didn't run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddnvjbgetvj6l13tgih4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddnvjbgetvj6l13tgih4.png" alt="docker run result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The answer to this was quite simple.&lt;/p&gt;

&lt;p&gt;1. To start a container use-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker container start container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: The configuration specified for the container in the docker-compose file will be applied to the container by default so, you don't have to do them manually.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2q8m2olnos5xc3hd8qpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2q8m2olnos5xc3hd8qpd.png" alt="docker ps result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. To stop a container use-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker container stop container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3. To open up bash in the container use-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker container &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; container_name bash
bash-5.1# 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it!&lt;br&gt;
Thanks for reading!&lt;br&gt;
Have a marvelous day!😇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Connect To Postgres database running on a Docker container using psql</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Sat, 16 Oct 2021 05:54:44 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/connect-to-postgres-database-running-on-a-docker-container-using-psql-4o0f</link>
      <guid>https://dev.to/ankitbrijwasi/connect-to-postgres-database-running-on-a-docker-container-using-psql-4o0f</guid>
      <description>&lt;p&gt;Recently while working, I was required to connect to a database that was running on a docker container using psql.&lt;/p&gt;

&lt;p&gt;If you are also dealing with something like this, then, follow along&lt;/p&gt;

&lt;p&gt;1. Start the docker container&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; container_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2. Now run the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;psql &lt;span class="nt"&gt;-h&lt;/span&gt; localhost &lt;span class="nt"&gt;-p&lt;/span&gt; 5432 &lt;span class="nt"&gt;-U&lt;/span&gt; username &lt;span class="nt"&gt;-d&lt;/span&gt; database_name
Password &lt;span class="k"&gt;for &lt;/span&gt;user username:

psql &lt;span class="o"&gt;(&lt;/span&gt;12.8 &lt;span class="o"&gt;(&lt;/span&gt;Ubuntu 12.8-0ubuntu0.20.04.1&lt;span class="o"&gt;))&lt;/span&gt;
Type &lt;span class="s2"&gt;"help"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;help.
&lt;span class="nv"&gt;database_name&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it&lt;br&gt;
Thank you for reading!&lt;br&gt;
Have a nice day!😇&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>docker</category>
      <category>database</category>
    </item>
    <item>
      <title>Enable Dark mode in chrome on Ubuntu</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Fri, 17 Sep 2021 11:09:03 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/enable-dark-mode-in-chrome-on-ubuntu-20na</link>
      <guid>https://dev.to/ankitbrijwasi/enable-dark-mode-in-chrome-on-ubuntu-20na</guid>
      <description>&lt;p&gt;Recently I started using Ubuntu as my default OS for programming and I am loving working in it!&lt;/p&gt;

&lt;p&gt;But there was an issue which I faced, By default in Google Chrome dark mode is not enabled and it was kind of a letdown.&lt;/p&gt;

&lt;p&gt;After digging up the Internet I found that In order to enable the Dark mode I needed to edit the &lt;code&gt;google-chrome.desktop&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;If you are also dealing with a similar issue then, just follow along&lt;/p&gt;

&lt;p&gt;Firstly open, the &lt;code&gt;google-chrome.desktop&lt;/code&gt; file using,&lt;br&gt;
&lt;code&gt;sudo gedit /usr/share/applications/google-chrome.desktop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After the file has been opened, you will need to edit two lines&lt;/p&gt;

&lt;p&gt;1. Search for the line-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/google-chrome-stable %U
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;replace it with-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/google-chrome-stable %U &lt;span class="nt"&gt;--enable-features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;WebUIDarkMode &lt;span class="nt"&gt;--force-dark-mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2. Search for the line-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/google-chrome-stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;replace it with-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/google-chrome-stable &lt;span class="nt"&gt;--enable-features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;WebUIDarkMode &lt;span class="nt"&gt;--force-dark-mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, Save the file and restart Chrome. Dark mode should be enabled now&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;br&gt;
Have a nice day!😇&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>linux</category>
    </item>
    <item>
      <title>What is DOM?! and how to manipulate it using JavaScript?</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Fri, 03 Jul 2020 09:28:44 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/what-is-dom-and-how-to-manipulate-it-using-javascript-3l41</link>
      <guid>https://dev.to/ankitbrijwasi/what-is-dom-and-how-to-manipulate-it-using-javascript-3l41</guid>
      <description>&lt;p&gt;When I first started my path on web development, The one thing which I kept on hearing from every Instructor was the word &lt;strong&gt;DOM&lt;/strong&gt; but I was never able to understand it properly, like is it the HTML markup of a web page, or is it the code of the web page which is available on the DevTools of the browser, or is it something else.&lt;/p&gt;

&lt;p&gt;Follow this post if you are also wondering the same thing!&lt;/p&gt;

&lt;h1&gt;
  
  
  What is DOM?
&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://www.w3.org/TR/DOM-Level-2-Core/introduction.html"&gt;W3C(World Wide Web Consortium)&lt;/a&gt; defines DOM as - &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Document Object Model (DOM) is an application programming interface (API) for valid HTML and well-formed XML documents. It defines the logical structure of documents and the way a document is accessed and manipulated.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In simple words, The DOM is an API that is loaded by the browser to represent the HTML code present on a web page as a tree of &lt;strong&gt;objects&lt;/strong&gt; or a &lt;strong&gt;node tree&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y_DZgFfD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/o7qhyd711p9pprwwpndb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y_DZgFfD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/o7qhyd711p9pprwwpndb.png" alt="Structure of DOM" width="567" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each &lt;strong&gt;node&lt;/strong&gt; or &lt;strong&gt;object&lt;/strong&gt; in this tree is an HTML element that can be added, updated, or deleted dynamically by using a scripting language such as JavaScript.&lt;/p&gt;




&lt;h1&gt;
  
  
  What is DOM manipulation?
&lt;/h1&gt;

&lt;p&gt;DOM manipulation means changing the way of how elements in a web page are added, updated, or removed by the browser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Always remember that all the HTML elements in the DOM are defined as &lt;code&gt;objects&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We can manipulate the DOM by using &lt;code&gt;DOM methods&lt;/code&gt; and &lt;code&gt;DOM properties&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The DOM methods are the actions that can be performed on the &lt;code&gt;HTML elements&lt;/code&gt;, whereas, DOM properties are values of these &lt;code&gt;HTML elements&lt;/code&gt; that we can set or change&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Example -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"demo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I am being inserted to the web page by JavaScript dynamically&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output-&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fr0Vh3nf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/4zk4pf514kwygbqlptnt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fr0Vh3nf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/4zk4pf514kwygbqlptnt.png" alt="Output" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above code, &lt;code&gt;getElementById&lt;/code&gt; is a DOM method and &lt;code&gt;innerHTML&lt;/code&gt; is DOM property&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;getElementById&lt;/code&gt; DOM method is used to find the HTML elements by ID.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;innerHTML&lt;/code&gt; DOM property is used get or change the HTML elements values.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this example, the &lt;code&gt;getElementById&lt;/code&gt; finds the HTML element with &lt;code&gt;id="demo"&lt;/code&gt; and then stores it in a variable &lt;code&gt;element&lt;/code&gt;. After that, we are using the &lt;code&gt;innerHTML&lt;/code&gt; DOM property to dynamically modify the content of the HTML element that is stored inside the &lt;code&gt;element&lt;/code&gt; variable(i.e. the &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tag)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You may be wondering that in the &lt;code&gt;let element = document.getElementById("demo");&lt;/code&gt; line what is &lt;code&gt;document&lt;/code&gt;? well, &lt;code&gt;document&lt;/code&gt; is an object that is the owner(parent) of all other objects present on the web page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Some more DOM methods -
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.getElementsByClassName(name)&lt;/code&gt; - gets the elements by class name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.getElementsByTagName(name)&lt;/code&gt; - gets the elements by tag name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.createElement(element)&lt;/code&gt; - creates an element&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.removeChild(element)&lt;/code&gt; - removes an element&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.appendChild(element)&lt;/code&gt; - Adds an HTML element&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Some more DOM properties -
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.id&lt;/code&gt; - gets the id of an element&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.className&lt;/code&gt; - gets the class of an element&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.clientHeight&lt;/code&gt; - gets the height of an element&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.attributes&lt;/code&gt; - gets the assigned attributes of the element&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find all the DOM methods and properties &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want a more detailed and in-depth explanation (including a small project🤩) of this then you can check out the video explanation of the same &lt;a href="https://youtu.be/09WlqjKT0_8"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, If you find this post helpful then please like and share this&lt;br&gt;
post and also help me get 3k subscribers on my &lt;a href="https://www.youtube.com/channel/UCmI1-o9-wJG_Vd0orE-44RQ"&gt;YOUTUBE CHANNEL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank You, and you are #awesome💙😊&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I created a cool Spinner component using JavaScript</title>
      <dc:creator>ankit-brijwasi</dc:creator>
      <pubDate>Tue, 30 Jun 2020 15:54:27 +0000</pubDate>
      <link>https://dev.to/ankitbrijwasi/i-created-a-cool-spinner-component-using-javascript-2emo</link>
      <guid>https://dev.to/ankitbrijwasi/i-created-a-cool-spinner-component-using-javascript-2emo</guid>
      <description>&lt;p&gt;Hey, I hope you are having a marvelous day, In this post, I want to tell you about this cool component, I created using javascript.&lt;/p&gt;

&lt;p&gt;The component is &lt;strong&gt;Spinner&lt;/strong&gt;, by which users can generate coupons. Its usage is pretty simple, the user will enter his/her credentials and submit the form. after which the spinner spins and gives the user a coupon🤗.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pLsG0_mA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/njd7u7u9847j4rnvdfac.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pLsG0_mA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/njd7u7u9847j4rnvdfac.jpg" alt="Spinner image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The great thing about this component is that as all the wheel markup, styling and images are being &lt;strong&gt;injected by JavaScript&lt;/strong&gt;, due to which this component can be loaded &lt;strong&gt;asynchronously&lt;/strong&gt;🤩 this makes initial DOM light-weighted resulting in a &lt;strong&gt;great performance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There's something more, as we are using JavaScript to inject the components of the Spinner, which means we can also &lt;strong&gt;remove&lt;/strong&gt; all the injected markup of the component from the DOM, as soon as the component leaves the screen🤩. That means all the unnecessary markup will no longer be present in the DOM when it is no longer needed😌.&lt;/p&gt;

&lt;p&gt;You can see a detailed explanation of the component &lt;a href="https://youtu.be/0NrhRbWinls"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a tutorial on how I created this component, help me get &lt;strong&gt;15 likes&lt;/strong&gt; on the above video😊.&lt;/p&gt;

&lt;p&gt;Thank You, and you are #awesome💙&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>css</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
