<?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: Aadi Bajpai</title>
    <description>The latest articles on DEV Community by Aadi Bajpai (@aadibajpai).</description>
    <link>https://dev.to/aadibajpai</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%2F189258%2F38aff74b-1f17-474d-857e-93e6c39890c5.jpg</url>
      <title>DEV Community: Aadi Bajpai</title>
      <link>https://dev.to/aadibajpai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aadibajpai"/>
    <language>en</language>
    <item>
      <title>What's your favourite side-project?</title>
      <dc:creator>Aadi Bajpai</dc:creator>
      <pubDate>Fri, 20 Sep 2019 02:26:29 +0000</pubDate>
      <link>https://dev.to/aadibajpai/what-s-your-favourite-side-project-1flo</link>
      <guid>https://dev.to/aadibajpai/what-s-your-favourite-side-project-1flo</guid>
      <description>&lt;p&gt;You know, that one thing you made for just your own use but is pretty cool.&lt;/p&gt;

&lt;p&gt;I'll start: I was pretty annoyed at having to manually update my résumé every month or so. With things like download numbers, it gets outdated pretty fast. &lt;/p&gt;

&lt;p&gt;Enter DynamicLaTeX. Auto-updates stuff every day and deployed to Heroku. Pretty nifty, imo.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aadibajpai"&gt;
        aadibajpai
      &lt;/a&gt; / &lt;a href="https://github.com/aadibajpai/DynamicLaTeX"&gt;
        DynamicLaTeX
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔮 auto update LaTeX documents with the latest numbers and info
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
DynamicLaTeX 🔮
&lt;/h1&gt;
&lt;p&gt;Your LaTeX document always has the latest numbers when clicked. Originally created for updating LaTeX resumes.&lt;/p&gt;
&lt;p&gt;Highly extensible.&lt;/p&gt;
&lt;h2&gt;
📜 Usage&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Define this new command in your LaTeX document:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-text-tex-latex"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;\newcommand&lt;/span&gt;{&lt;span class="pl-c1"&gt;\py&lt;/span&gt;}[1]{&lt;span class="pl-c1"&gt;\textit&lt;/span&gt;{&lt;span class="pl-mi"&gt;&lt;span class="pl-cce"&gt;\%&lt;/span&gt;#1&lt;span class="pl-cce"&gt;\%&lt;/span&gt;&lt;/span&gt;}}&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Wherever you want to format the dynamic variable, use the command as:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-text-tex-latex"&gt;&lt;pre&gt;&lt;span class="pl-c1"&gt;\py&lt;/span&gt;{&amp;lt;variable_name&amp;gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add your LaTeX code in &lt;code&gt;resume.tex&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;code&gt;main.py&lt;/code&gt;, add the same variable names and updation function to &lt;code&gt;template_values&lt;/code&gt;. That's it!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Serve your pdf by running &lt;code&gt;main.py&lt;/code&gt;. I've used my name in the endpoints so do change that with your own :)&lt;/p&gt;
&lt;p&gt;There are a few updation helper functions provided in &lt;code&gt;updater.py&lt;/code&gt; already as well.&lt;/p&gt;
&lt;h2&gt;
❔ Why?&lt;/h2&gt;
&lt;p&gt;I use it to get the latest downloads count for SwagLyrics and SwSpotify then write that so the resume is always up to
date
Previously, I had to update the download count manually. Now, it's accurate…&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/aadibajpai/DynamicLaTeX"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;What's something you made to automate the boring stuff?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Where do you fall in the tabs vs. spaces debate if you like to use tabs that are actually 4 spaces?</title>
      <dc:creator>Aadi Bajpai</dc:creator>
      <pubDate>Tue, 09 Jul 2019 16:12:25 +0000</pubDate>
      <link>https://dev.to/aadibajpai/where-do-you-fall-in-the-tabs-vs-spaces-debate-if-you-like-to-use-tabs-that-are-actually-4-spaces-bmg</link>
      <guid>https://dev.to/aadibajpai/where-do-you-fall-in-the-tabs-vs-spaces-debate-if-you-like-to-use-tabs-that-are-actually-4-spaces-bmg</guid>
      <description>

</description>
      <category>discuss</category>
      <category>tabs</category>
      <category>spaces</category>
    </item>
    <item>
      <title>Deploying to PythonAnywhere via GitHub</title>
      <dc:creator>Aadi Bajpai</dc:creator>
      <pubDate>Thu, 20 Jun 2019 01:09:18 +0000</pubDate>
      <link>https://dev.to/aadibajpai/deploying-to-pythonanywhere-via-github-1j7b</link>
      <guid>https://dev.to/aadibajpai/deploying-to-pythonanywhere-via-github-1j7b</guid>
      <description>&lt;p&gt;&lt;strong&gt;Everyone can do this:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;local → github&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With ssh access (paid) you can do this:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;local → pythonanywhere&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I do here is (free):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;local → github → pythonanywhere&lt;/p&gt;

&lt;p&gt;I first list why you might wanna do this and then go to the how. If you want to directly jump to the how then feel free to take a leap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;PythonAnywhere is awesome. It’s free, good resources, even a database and you can have a dynamic website running in minutes. It’s a very good resource if you’re starting out and just want to play around or even if you want to host an API or something of your own.&lt;/p&gt;

&lt;p&gt;But it has it’s flaws, what if you want to open-source what you’re working on? Do you maintain two separate places and keep committing twice? Once to production at PythonAnywhere and once again to GitHub for people to check your code out. What if you merge a Pull Request or want to integrate CI? Doing the same thing over and over again sucks.&lt;/p&gt;

&lt;p&gt;GitHub is great for collaboration and even viewing the code, they have a way better UI than PythonAnywhere and I mean, editing code directly on PythonAnywhere isn’t a nice experience. What if there was a way to link all of it?&lt;/p&gt;

&lt;p&gt;You push to GitHub and it updates your running web app at PythonAnywhere and reloads it as well. You can merge a PR, use Issues, browse your code from anywhere without even signing in and opening the file in an editor and well everything GitHub has to offer.&lt;/p&gt;

&lt;p&gt;I hear you, “Okay Aadi, all of this sounds well and good but how?”&lt;/p&gt;

&lt;p&gt;Say no more.&lt;/p&gt;

&lt;h3&gt;
  
  
  How?
&lt;/h3&gt;

&lt;p&gt;We use GitHub webhooks to tell our application that it has been updated so it does a pull and then reloads itself.&lt;/p&gt;

&lt;p&gt;I’ll take the example of my application SwagLyrics whose backend is hosted on PythonAnywhere. I’m using Flask so you might want to adjust accordingly if you’re not. This is my repo so you can use it as a reference:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SwagLyrics/swaglyrics-issue-maker"&gt;SwagLyrics/swaglyrics-issue-maker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First off, make sure your repository on GitHub and PythonAnywhere are in sync, the GitHub one should be the origin and if you haven’t made a repo on PythonAnywhere yet, you could initialise one or clone into PythonAnywhere from GitHub.&lt;/p&gt;

&lt;p&gt;Something like&lt;br&gt;
&lt;/p&gt;

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

git remote add origin https://github.com/yourusername/yourreponame.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now go to your repository on GitHub → Settings → Webhooks → Add webhook.&lt;/p&gt;

&lt;p&gt;This is what you see:&lt;/p&gt;

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

&lt;p&gt;In the Payload URL add &lt;a href="https://your_domain/route_to"&gt;https://your_domain/route_to_update&lt;/a&gt;_update&lt;/p&gt;

&lt;p&gt;Eg. my repo has the webhook sent to &lt;a href="https://aadibajpai.pythonanywhere.com/update_server"&gt;https://aadibajpai.pythonanywhere.com/update_server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then change the Content type from application/x-www-form-urlencoded to application/json (I’ll tell you why a bit later).&lt;/p&gt;

&lt;p&gt;We’ll come to the secret part a bit later as well.&lt;/p&gt;

&lt;p&gt;Make sure it’s the push event that triggers the webhook and click on Add webhook.&lt;/p&gt;

&lt;p&gt;Now, open up your flask app and we’ll configure a route which receives the information from GitHub whenever there’s a push event. This route will be the same as the one we used in the Payload URL. We do not explicitly checkout master since I assume that’s the only branch here.&lt;/p&gt;

&lt;p&gt;A barebones simple setup would look something like this:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;git&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;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/update_server&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&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;POST&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;webhook&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Repo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;path/to/git_repo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;origin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;

   &lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Updated PythonAnywhere successfully&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Wrong event type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is a very rudimentary version and there’s a more complete version below.&lt;/p&gt;

&lt;p&gt;Now whenever there’s a push event, this route will receive the info and update itself by doing a pull.&lt;/p&gt;

&lt;p&gt;Hopefully, this is what it looks like when you make a commit&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4lfwb7clfihorrewe6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4lfwb7clfihorrewe6c.png" width="800" height="169"&gt;&lt;/a&gt;fingers crossed&lt;/p&gt;

&lt;p&gt;Before I tell you how to secure your webhook, I’ll tell you how to make sure your app reloads after a pull so you don’t have to manually do that.&lt;/p&gt;
&lt;h4&gt;
  
  
  Auto-reloading your webapp
&lt;/h4&gt;

&lt;p&gt;We’re going to use git hooks to do it. These are shell commands executed after a git event takes place. There’s no post-pull hook, but…&lt;/p&gt;

&lt;p&gt;We take advantage of the fact that a git pull is nothing but a git fetch → git merge and there is a &lt;a href="https://git-scm.com/docs/githooks#_post_merge"&gt;post-merge&lt;/a&gt; hook. It executes if the pull completed successfully.&lt;/p&gt;

&lt;p&gt;In your git repo over at PythonAnywhere go to .git/hooks/&lt;/p&gt;

&lt;p&gt;There will be a bunch of pre-existing ones but make a new file called post-merge.&lt;/p&gt;

&lt;p&gt;Put the following code there:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/sh
touch /path/to/username_pythonanywhere_com_wsgi.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use the path to your wsgi file which when touched, reloads your webapp.&lt;/p&gt;

&lt;p&gt;Now to make this executable, open a bash console there and run&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chmod +x post-merge&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That’s it, now you can test that it works by making a sample commit.&lt;/p&gt;

&lt;p&gt;Most importantly, now we move on to securing your webhook.&lt;/p&gt;
&lt;h3&gt;
  
  
  Securing your webhook
&lt;/h3&gt;

&lt;p&gt;This is necessary so that someone else cannot spam your server with requests to update it.&lt;/p&gt;

&lt;p&gt;We follow this guide for it &lt;a href="https://developer.github.com/webhooks/securing/"&gt;https://developer.github.com/webhooks/securing/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First off, export that secret token and add it to PythonAnywhere as an environment variable as well as in the Secret field in your GitHub webhook settings. This might be helpful &lt;a href="https://help.pythonanywhere.com/pages/environment-variables-for-web-apps"&gt;https://help.pythonanywhere.com/pages/environment-variables-for-web-apps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, GitHub lists their method in Ruby but we use Python so while the method is same, here is the comparison function:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Now, modify your update_server route to check if signature is valid by adding these lines before the updation part of your route:&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;x_hub_signature&lt;/span&gt; &lt;span class="o"&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;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Hub&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;is_valid_signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_hub_signature&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="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w_secret&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;w_secret is supposed to be your webhooks secret that you set as an environment variable.&lt;/p&gt;

&lt;p&gt;Now it doesn’t make much sense to have no logging as well as no other security checks to verify that the webhook is in fact from GitHub or that the pull event actually contained data, so you can go and copy paste the &lt;a href="https://github.com/SwagLyrics/swaglyrics-issue-maker/blob/35d23d0ba416e742e381da931d592ce6f58fc13f/issue_maker.py#L268"&gt;route on my repo&lt;/a&gt; that contains all that into your own and modify it for yourself where necessary, you already know the important parts by now 😃&lt;/p&gt;

&lt;p&gt;I hope this was helpful, I know it’s a bit detailed but I wanted you to know what’s happening. If you found it too long, you could get away with copy pasting a lot of it after configuring the webhook over at GitHub and making the git hook.&lt;/p&gt;

&lt;p&gt;I obviously didn’t come up with it myself, rather I’d say I just cherry picked the right parts from the right places and experimented in the hope that this can be a complete resource.&lt;/p&gt;

&lt;p&gt;Here are the references so you can know and do more with it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://stackoverflow.com/a/54268132/9044659"&gt;https://stackoverflow.com/a/54268132/9044659&lt;/a&gt; (basic setup)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.github.com/webhooks/"&gt;https://developer.github.com/webhooks/&lt;/a&gt; (GitHub webhooks documentation)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/CCExtractor/sample-platform/blob/master/mod_deploy/controllers.py"&gt;https://github.com/CCExtractor/sample-platform/blob/master/mod_deploy/controllers.py&lt;/a&gt; (detailed implementation with better checks, in case you want to go all in)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SwagLyrics/swaglyrics-issue-maker/blob/35d23d0ba416e742e381da931d592ce6f58fc13f/issue_maker.py#L268"&gt;https://github.com/SwagLyrics/swaglyrics-issue-maker/blob/35d23d0ba416e742e381da931d592ce6f58fc13f/issue_maker.py#L268&lt;/a&gt; (my own route to update PythonAnywhere)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SwagLyrics/SwagLyrics-For-Spotify"&gt;https://github.com/SwagLyrics/SwagLyrics-For-Spotify&lt;/a&gt; (this is where I use it, shameless repo plug to get stars ❤️)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Please let me know if there is any part that can be improved or made easier to understand.&lt;/p&gt;

&lt;p&gt;Thanks a lot for reading!&lt;/p&gt;

&lt;p&gt;P. S. I did stay up way late doing this, the things we do for science &lt;em&gt;sigh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>flask</category>
      <category>tutorial</category>
      <category>github</category>
      <category>python</category>
    </item>
  </channel>
</rss>
