<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Guguweb - vscode</title><link href="https://www.guguweb.com/" rel="alternate"></link><link href="https://www.guguweb.com/feeds/vscode.atom.xml" rel="self"></link><id>https://www.guguweb.com/</id><updated>2022-01-14T20:56:31+01:00</updated><subtitle>Freelance developer and sysadmin</subtitle><entry><title>Remote debugging a Django project in VS Code</title><link href="https://www.guguweb.com/2020/04/20/remote-debugging-a-django-project-in-vs-code/" rel="alternate"></link><published>2020-04-20T08:02:16+00:00</published><updated>2022-01-14T20:56:31+01:00</updated><author><name>Augusto Destrero</name></author><id>tag:www.guguweb.com,2020-04-20:/2020/04/20/remote-debugging-a-django-project-in-vs-code/</id><summary type="html">&lt;p&gt;In this tutorial you will learn how to use VS Code for remote debugging. I&amp;#8217;ll show you how to debug a Django application running on a remote server over SSH or in a Docker container.&lt;/p&gt;
&lt;p&gt;Imagine the following scenario: You developed a Django application on your laptop. You did …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In this tutorial you will learn how to use VS Code for remote debugging. I&amp;#8217;ll show you how to debug a Django application running on a remote server over SSH or in a Docker container.&lt;/p&gt;
&lt;p&gt;Imagine the following scenario: You developed a Django application on your laptop. You did your tests and made some debug. The application worked fine. Finally you deploy the application on a production server. Something goes wrong. There is a bug to hunt down and you cannot reproduce it locally.&lt;/p&gt;
&lt;p&gt;You could connect to the remote server using SSH, then use a remote editor like &lt;code&gt;vim&lt;/code&gt; on &lt;code&gt;nano&lt;/code&gt; to tweak the code. You could put some &lt;code&gt;print("I'm here!")&lt;/code&gt; here and there, trying to find the bug.&lt;/p&gt;
&lt;p&gt;But wait, aren&amp;#8217;t you a VS Code user? Why you have to debug in an editor you don&amp;#8217;t know? Wouldn&amp;#8217;t be great if you could connect to the remote environment from VS Code and debug your application inside the IDE you love?&lt;/p&gt;
&lt;p&gt;It turns out that VS Code has some extensions made exactly for that purpose, and you&amp;#8217;ll learn how to use them.&lt;/p&gt;
&lt;p&gt;At the end of this tutorial you will be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connect with VS Code to a remote server using SSH and remotely debug a web project.&lt;/li&gt;
&lt;li&gt;Run a Docker container within VS Code and debug a project inside the container.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before starting the tutorial let me say that I assume you are actively using Visual Studio Code for development and you already know how to install VS Code extensions and how to manage a Python project in the IDE. If you need a refresh you can check this &lt;a href="https://code.visualstudio.com/docs/languages/python"&gt;introductory tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Table of Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-remote-debugging-over-ssh"&gt;1. Remote Debugging Over SSH&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-if-you-do-not-have-a-remote-ssh-server"&gt;What if You Do Not Have a Remote SSH Server?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#install-the-vs-code-extension"&gt;Install the VS Code Extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#generate-an-ssh-key-pair-and-configure-server-for-remote-access"&gt;Generate an SSH Key Pair and Configure Server for Remote Access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#connect-to-remote-server-in-vs-code"&gt;Connect to Remote Server in VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#create-a-simple-django-project-on-remote-server"&gt;Create a Simple Django Project on Remote Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mapping-ports-to-test-the-project"&gt;Mapping Ports to Test the Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-buggy-django-app"&gt;A buggy Django app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-in-vs-code"&gt;Debugging in VS Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-remote-debugging-on-a-docker-container"&gt;2. Remote Debugging on a Docker Container&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#install-docker"&gt;Install Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#install-the-vs-code-extension_1"&gt;Install the VS Code Extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#an-example-container-for-your-project"&gt;An Example Container for Your Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#understanding-devcontainerjson"&gt;Understanding devcontainer.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#debugging-in-vs-code_1"&gt;Debugging in VS Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-other-remote-debugging-scenarios"&gt;3. Other Remote Debugging Scenarios&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#wsl"&gt;WSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#liveshare"&gt;LiveShare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-conclusion"&gt;4. Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="1-remote-debugging-over-ssh"&gt;1. Remote Debugging Over SSH&lt;/h2&gt;
&lt;p&gt;The first scenario I will present is remote debugging on a server that is accessible via SSH. I assume that you already know how to connect to a remote server using SSH. You can find &lt;a href="https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys"&gt;good resources&lt;/a&gt; on the internet if you need more information.&lt;/p&gt;
&lt;h3 id="what-if-you-do-not-have-a-remote-ssh-server"&gt;What if You Do Not Have a Remote SSH Server?&lt;/h3&gt;
&lt;p&gt;Of course to follow along with this part of the tutorial you&amp;#8217;ll need an SSH remote server to connect to. If you don&amp;#8217;t have one readily available you can spin up a local virtual machine using &lt;a href="https://www.vagrantup.com/intro/getting-started/index.html"&gt;Vagrant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After installing Vagrant and VirtualBox, creating a virtual machine is as simple as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ vagrant init hashicorp/bionic64
$ vagrant up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You&amp;#8217;ll find an Ubuntu Server listening for SSH connections on &lt;code&gt;localhost:2222&lt;/code&gt;. Username is &lt;code&gt;vagrant&lt;/code&gt;, password is &lt;code&gt;vagrant&lt;/code&gt;. Easy enough!&lt;/p&gt;
&lt;p&gt;If you prefer to test on a real remote environment, you can create a virtual machine on &lt;a href="https://code.visualstudio.com/remote-tutorials/ssh/create-vm"&gt;Azure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this tutorial I&amp;#8217;ll use the Vagrant method to spin up a test SSH “remote” server on localhost, port 2222.&lt;/p&gt;
&lt;h3 id="install-the-vs-code-extension"&gt;Install the VS Code Extension&lt;/h3&gt;
&lt;p&gt;First of all you have to install the &lt;em&gt;Remote &amp;#8211; SSH&lt;/em&gt; extension from the VS Code marketplace. Go to the &lt;em&gt;Extensions&lt;/em&gt; section in VS Code and install the extension from there:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Install VS Code SSH extension" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_remote_ssh_install.png"&gt;&lt;/p&gt;
&lt;p&gt;If the extension has been installed correctly you will see a new green icon in the bottom left corner of the VS Code window.&lt;/p&gt;
&lt;h3 id="generate-an-ssh-key-pair-and-configure-server-for-remote-access"&gt;Generate an SSH Key Pair and Configure Server for Remote Access&lt;/h3&gt;
&lt;p&gt;You&amp;#8217;ll need to access the SSH server without entering the passphrase every time. For this you&amp;#8217;ll need an SSH keypair to connect to the server. If you don&amp;#8217;t already have one you can generate one by typing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh-keygen -t rsa -b &lt;span class="m"&gt;2048&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can leave the SSH key passphrase empty, when prompted. In this way the public key will be saved in the &lt;code&gt;.ssh/id_rsa.pub&lt;/code&gt; file under your home directory.&lt;/p&gt;
&lt;p&gt;The last step is copying the public key on the remote server and appending it to the &lt;code&gt;.ssh/authorized_keys&lt;/code&gt; file, inside the home directory of the remote user you&amp;#8217;ll use to connect.&lt;/p&gt;
&lt;p&gt;If you are using the test SSH server created with Vagrant, as shown previously, the commands to copy the SSH public key in the right place are:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;localhost:~$ scp -P &lt;span class="m"&gt;2222&lt;/span&gt; ~/.ssh/id_rsa.pub vagrant@localhost:
localhost:~$ ssh -p &lt;span class="m"&gt;2222&lt;/span&gt; vagrant@localhost
vagrant@vagrant:~$ cat id_rsa.pub &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt; ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When prompted for a password remember that both the username and the password are &lt;code&gt;vagrant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The last command is ran on the remote SSH server. You should now be able to login to SSH server without the need to write your passphrase.&lt;/p&gt;
&lt;h3 id="connect-to-remote-server-in-vs-code"&gt;Connect to Remote Server in VS Code&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s time to connect to the remote server in VS Code. Click on the green icon on the bottom left corner:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code Remote Window" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_remote_window_icon.png"&gt;&lt;/p&gt;
&lt;p&gt;A command prompt will appear at the top of the windows, click on &lt;strong&gt;Remote-SSH: Connect to Host…&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code Remote SSH" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_remote_ssh_connect.png"&gt;&lt;/p&gt;
&lt;p&gt;If you already have some SSH servers configured in your &lt;em&gt;.ssh/config&lt;/em&gt; file you&amp;#8217;ll see them listed here. In our example we will connect to a new SSH server, by writing the connection parameters in the &lt;em&gt;user@host:port&lt;/em&gt; form.&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code Remote SSH Connection Details" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_remote_ssh_connect_details.png"&gt;&lt;/p&gt;
&lt;p&gt;Press Enter and a new VS Code windows will appear. That&amp;#8217;s literally your window to the remote system.&lt;/p&gt;
&lt;p&gt;The file explorer will let you to add remote directories in your workspace. You&amp;#8217;ll be able to edit files as if they were local.&lt;/p&gt;
&lt;p&gt;You can even open a terminal inside VS Code and it will act as a remote terminal. You&amp;#8217;ll make use of the remote terminal in the following section.&lt;/p&gt;
&lt;h3 id="create-a-simple-django-project-on-remote-server"&gt;Create a Simple Django Project on Remote Server&lt;/h3&gt;
&lt;p&gt;A Django project will serve just as an example of what you can do with VS Code SSH extension to debug your remote application. Even if you&amp;#8217;re not familiar with Django you&amp;#8217;ll be able to follow along with the tutorial. If otherwise you&amp;#8217;d like to better understand what you are doing here you can read this &lt;a href="https://docs.djangoproject.com/en/2.2/intro/tutorial01/"&gt;introductory Django tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the VS Code remote window, open a terminal using the &lt;em&gt;“Terminal &amp;gt; New terminal”&lt;/em&gt; menu. Notice how this terminal is running on the remote server, and not locally on your machine.&lt;/p&gt;
&lt;p&gt;First you&amp;#8217;ll need to install a package on the remote server. This is needed to create a virtualenv for the project:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vagrant@vagrant:~$ sudo apt update
vagrant@vagrant:~$ sudo apt install python3-venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then you can create a virtualenv and activate it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vagrant@vagrant:~$ python3 -mvenv vscode-example-env
vagrant@vagrant:~$ . vscode-example-env/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now install Django on the virtualenv and create a new project:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;vscode-example-env&lt;span class="o"&gt;)&lt;/span&gt; vagrant@vagrant:~$ pip install &lt;span class="nv"&gt;django&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.2.12
&lt;span class="o"&gt;(&lt;/span&gt;vscode-example-env&lt;span class="o"&gt;)&lt;/span&gt; vagrant@vagrant:~$ django-admin startproject vscode_example
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="mapping-ports-to-test-the-project"&gt;Mapping Ports to Test the Project&lt;/h3&gt;
&lt;p&gt;Now that you&amp;#8217;ve created the example Django project, go into the project directory, create/migrate the Django database and run the Django development server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;vscode-example-env&lt;span class="o"&gt;)&lt;/span&gt; vagrant@vagrant:~$ &lt;span class="nb"&gt;cd&lt;/span&gt; vscode_example
&lt;span class="o"&gt;(&lt;/span&gt;vscode-example-env&lt;span class="o"&gt;)&lt;/span&gt; vagrant@vagrant:~$ ./manage.py migrate
&lt;span class="o"&gt;(&lt;/span&gt;vscode-example-env&lt;span class="o"&gt;)&lt;/span&gt; vagrant@vagrant:~$ ./manage.py runserver
Watching &lt;span class="k"&gt;for&lt;/span&gt; file changes with StatReloader
Performing system checks...

System check identified no issues &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; silenced&lt;span class="o"&gt;)&lt;/span&gt;.
April &lt;span class="m"&gt;01&lt;/span&gt;, &lt;span class="m"&gt;2020&lt;/span&gt; - &lt;span class="m"&gt;17&lt;/span&gt;:35:01
Django version &lt;span class="m"&gt;2&lt;/span&gt;.2.12, using settings &lt;span class="s1"&gt;&amp;#39;vscode_example.settings&amp;#39;&lt;/span&gt;
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As you can see from the command output the Django development server is listening on &lt;em&gt;&lt;a href="http://127.0.0.1:8000/"&gt;http://127.0.0.1:8000/&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Don&amp;#8217;t confuse the &lt;em&gt;&lt;a href="http://127.0.0.1:8000/"&gt;http://127.0.0.1:8000/&lt;/a&gt;&lt;/em&gt; you see here. That is the localhost &lt;strong&gt;of the server&lt;/strong&gt; and not the local address of your PC.&lt;/p&gt;
&lt;p&gt;That address will not be accessible from your PC because it&amp;#8217;s local to the server. Fortunately VS Code lets you map ports of remote server to ports of your PC. This will let you access server ports as if they were local.&lt;/p&gt;
&lt;p&gt;Click on VS Code “Remote explorer” left pane:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code Remote explorer" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_remote_explorer.png"&gt;&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll see that in the “Forwarded ports” section there is a port on the server that is “&amp;#8221;Not Forwarded”. Hover with your mouse on the port and click on the “+” icon:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code Remote explorer add port" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_remote_explorer_add_port.png"&gt;&lt;/p&gt;
&lt;p&gt;Now that the server 8000 port is mapped on your PC 8000 port, you&amp;#8217;ll be able to access your Django project on &lt;em&gt;http://localhost:8000/&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Django default page" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/django_default_page.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Don&amp;#8217;t forget to forward the 8000 port every time you restart the Django development server.&lt;/p&gt;
&lt;h3 id="a-buggy-django-app"&gt;A buggy Django app&lt;/h3&gt;
&lt;p&gt;Now that you have a Django project running remotely why don&amp;#8217;t you create a Django app to test some remote debugging? Let&amp;#8217;s do it!&lt;/p&gt;
&lt;p&gt;Back to the VS Code terminal and stop the Django development server with CTRL-C. Then create a Django app:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;vscode-example-env&lt;span class="o"&gt;)&lt;/span&gt; vagrant@vagrant:~$ ./manage.py startapp todo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Every example project has a todo app, isn&amp;#8217;t it?&lt;/p&gt;
&lt;p&gt;Now it&amp;#8217;s time to edit some files remotely using VS Code. As promised you won&amp;#8217;t use vim or nano over SSH!&lt;/p&gt;
&lt;p&gt;Click on the VS Code file explorer pane, then on Open Folder button:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code Open Folder button" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_fileexplorer_openfolder_button.png"&gt;&lt;/p&gt;
&lt;p&gt;From the menu choose the directory you want to add to VS Code workspace, that is &lt;em&gt;vscode_example&lt;/em&gt; in our case:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code Open Folder menu" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_fileexplorer_openfolder_menu.png"&gt;&lt;/p&gt;
&lt;p&gt;Select the directory and click on “OK”. Now you can browse the remote files in the VS Code file explorer!&lt;/p&gt;
&lt;p&gt;Open the &lt;em&gt;todo/view.py&lt;/em&gt; file and add the following code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.http&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HttpResponse&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;random_todo&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;todo_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;Buy milk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;Clean the room&amp;#39;&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;Write tutorial&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;Read books&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&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;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todo_list&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then open the &lt;em&gt;vscode_example/urls.py&lt;/em&gt; file and edit like this to add a route to the view:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.urls&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;todo.views&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="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;admin/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urls&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="s1"&gt;&amp;#39;todo/random/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random_todo&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;Now you can return to the terminal and restart the Django development server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;vscode-example-env&lt;span class="o"&gt;)&lt;/span&gt; vagrant@vagrant:~$ ./manage.py runserver
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Check that the virtualenv is active before running the server. Also check that the port 8000 is mapped in the VS Code “Remote explorer” left pane, as seen previously.&lt;/p&gt;
&lt;p&gt;Open your web browser and go to the newly created url at &lt;em&gt;http://localhost:8000/todo/random/&lt;/em&gt;. You should see a randomly chosen todo item. Try to refresh the page a couple of times, and then a bug will show up:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Django buggy view" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/django_buggy_view.png"&gt;&lt;/p&gt;
&lt;p&gt;There is something wrong in our todo list! Of course you can spot the bug quite easily in our toy project, but why don&amp;#8217;t leverage a full featured debugger in VS Code to check what&amp;#8217;s going on?&lt;/p&gt;
&lt;h3 id="debugging-in-vs-code"&gt;Debugging in VS Code&lt;/h3&gt;
&lt;p&gt;Stop the Django development server with CTRL-C and click on the VS Code “&amp;#8221;Run” left pane. There you&amp;#8217;ll see a &lt;em&gt;create a launch.json file&lt;/em&gt; link.&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code create launch.json file" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_run_create_launch.png"&gt;&lt;/p&gt;
&lt;p&gt;Click on the link and select &lt;em&gt;More…&lt;/em&gt; from the menu. You can then install the Python extension on remote server by clicking on &lt;strong&gt;Install in SSH: localhost&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code install Python remote extension" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_install_python_remote_extension.png"&gt;&lt;/p&gt;
&lt;p&gt;The remote extension will install and you&amp;#8217;ll have to reload the VS Code window to activate it.&lt;/p&gt;
&lt;p&gt;Go back to the Run left pane and click on &lt;em&gt;create a launch.json file&lt;/em&gt; link again. This time you&amp;#8217;ll see a Django item in the menu. Click on it.&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code run Django debug" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_run_django_debug.png"&gt;&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;launch.json&lt;/em&gt; file will open in VS Code. You&amp;#8217;ll only have to add the path to your virtualenv, by adding a &lt;code&gt;pythonPath&lt;/code&gt; entry in the configuration.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Use IntelliSense to learn about possible attributes.&lt;/span&gt;
    &lt;span class="c1"&gt;// Hover to view descriptions of existing attributes.&lt;/span&gt;
    &lt;span class="c1"&gt;// For more info, visit: https://go.microsoft.com/fwlink/?linkid=830387&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;0.2.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;configurations&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Python: Django&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;request&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;launch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;pythonPath&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/vagrant/vscode-example-env/bin/python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;program&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;${workspaceFolder}/manage.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;runserver&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;--noreload&amp;quot;&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;django&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;Now you can run the project for remote debugging in VS Code by hitting F5. Go to the &lt;em&gt;todo/views.py&lt;/em&gt; file and add a breakpoint on line 13:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code add breakpoint" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_breakpoint.png"&gt;&lt;/p&gt;
&lt;p&gt;Then try to reload the &lt;code&gt;http://localhost:8000/todo/random/&lt;/code&gt; page. You&amp;#8217;ll see that execution will block and you&amp;#8217;ll be able to inspect variables in VS Code:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code inspect variables" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_debug_variables.png"&gt;&lt;/p&gt;
&lt;p&gt;In this simple case the bug was a missing comma in the &lt;code&gt;todo_list&lt;/code&gt; definition.&lt;/p&gt;
&lt;p&gt;That was a trivial bug in a simple project, but imagine to leverage the power of VS Code debugger in a real project running remotely. Now you learned all the tools needed to accomplish this task and make your remote debugging easier.&lt;/p&gt;
&lt;h2 id="2-remote-debugging-on-a-docker-container"&gt;2. Remote Debugging on a Docker Container&lt;/h2&gt;
&lt;p&gt;Remote debugging can be useful also on another common scenario: debugging a project while running in a Docker container.&lt;/p&gt;
&lt;p&gt;Suppose that your team uses a Docker container to have a common and established development environment. You can leverage VS Code &lt;em&gt;Remote &amp;#8211; Containers&lt;/em&gt; extension to build and run the container and attach to it for remote debugging.&lt;/p&gt;
&lt;p&gt;I assume that you have some basic knowledge on how to obtain a Docker image and run it either by using Docker command line or VS Code Docker extension. If you need more information you can refer to &lt;a href="https://code.visualstudio.com/docs/containers/overview"&gt;this tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="install-docker"&gt;Install Docker&lt;/h3&gt;
&lt;p&gt;You have to install Docker to follow this tutorial. If you are on Windows or Mac you can install &lt;a href="https://www.docker.com/products/docker-desktop"&gt;Docker Desktop&lt;/a&gt;. If you are on Linux you can install Docker using your distribution package manager.&lt;/p&gt;
&lt;h3 id="install-the-vs-code-extension_1"&gt;Install the VS Code Extension&lt;/h3&gt;
&lt;p&gt;The next step is to install the &lt;em&gt;Remote &amp;#8211; Containers&lt;/em&gt; extension from the VS Code marketplace. Go to the &lt;em&gt;Extensions&lt;/em&gt; section in VS Code and install the extension from there:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code remote containers extension" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_remote_containers_install.png"&gt;&lt;/p&gt;
&lt;p&gt;If the extension has been installed correctly you will see a new green icon in the bottom left corner of the VS Code window.&lt;/p&gt;
&lt;p&gt;Clicking on the green icon will bring up the &lt;code&gt;Remote - Containers&lt;/code&gt; commands.&lt;/p&gt;
&lt;h3 id="an-example-container-for-your-project"&gt;An Example Container for Your Project&lt;/h3&gt;
&lt;p&gt;In this tutorial you&amp;#8217;ll clone an example project container from a Git repository. That container uses the same example Django application seen in previous section of this tutorial. It will serve as a starting point to see how you can build, run and perform remote debugging on a Python project running in a Docker container.&lt;/p&gt;
&lt;p&gt;Clone the repository using Git:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/baxeico/vscode_django_container.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Go into the &lt;em&gt;vscodedjangocontainer&lt;/em&gt; directory and launch VS Code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; vscode_django_container/
$ code .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;VS Code will notice that this directory contains a configuration for remote containers and it will prompt you to reopen the project in a container:&lt;/p&gt;
&lt;p&gt;&lt;img alt="VS Code reopen in container" class="img-fluid d-block mx-auto" src="https://www.guguweb.com/images/2020/04/vscode_reopen_in_container.png"&gt;&lt;/p&gt;
&lt;p&gt;Click on the &lt;em&gt;Reopen in Container&lt;/em&gt; button and VS Code will build the container and configure the project for remote debugging.&lt;/p&gt;
&lt;h3 id="understanding-devcontainerjson"&gt;Understanding devcontainer.json&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;Remote Containers&lt;/em&gt; extension will look for a file called &lt;em&gt;devcontainer.json&lt;/em&gt; in the &lt;em&gt;.devcontainer&lt;/em&gt; directory.&lt;/p&gt;
&lt;p&gt;The content of the file will look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Django container example&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;build&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;dockerfile&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Dockerfile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;..&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// Set *default* container specific settings.json values.&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;settings&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;terminal.integrated.shell.linux&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/bin/bash&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;python.pythonPath&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/bin/python3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c1"&gt;// IDs of extensions you want installed when the container is created.&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;extensions&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;ms-python.python&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c1"&gt;// make a list of ports inside the container available locally.&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;forwardPorts&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c1"&gt;// run commands after the container is created.&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;postCreateCommand&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pip3 install -r requirements.txt; cd vscode_example; ./manage.py migrate&amp;quot;&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;In the &lt;code&gt;build&lt;/code&gt; section you can define the parameters used to build the container. In this case you are using a Dockerfile contained in the same directory. The Dockerfile uses the Python3 official image from Docker Hub, without modifications.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;settings&lt;/code&gt; section you can define some specific settings for VS Code, when running in the container. Notice how the &lt;em&gt;pythonPath&lt;/em&gt; option is set to the python3 executable path in the Docker image.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;extensions&lt;/code&gt; section will let you define the VS Code extensions you want to install in the container. The &lt;em&gt;ms-python.python&lt;/em&gt; is required to let you debug Python applications.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;forwardPorts&lt;/code&gt; is useful to let you access your application as if it was local, by exposing container ports on the local host. Here you are mapping the 8000 port of the container to the same port of your local host.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;postCreateCommand&lt;/code&gt; is used to install the requirements of the Python application using &lt;em&gt;pip&lt;/em&gt; and to migrate the Django database after the container has been created.&lt;/p&gt;
&lt;p&gt;Here you can find a complete &lt;a href="https://code.visualstudio.com/docs/remote/containers#_devcontainerjson-reference"&gt;devcontainer.json reference&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="debugging-in-vs-code_1"&gt;Debugging in VS Code&lt;/h3&gt;
&lt;p&gt;Clicking on F5 will start the Django application. You can open the browser and point it to &lt;a href="http://localhost:8000/"&gt;&lt;em&gt;http://localhost:8000/&lt;/em&gt;&lt;/a&gt; to see the app running.&lt;/p&gt;
&lt;p&gt;VS Code will let you debug the code, set breakpoints, inspect variables as if the project is running locally.&lt;/p&gt;
&lt;p&gt;As usual, the launch configuration is made in the &lt;em&gt;launch.json&lt;/em&gt; file, inside the &lt;em&gt;.vscode&lt;/em&gt; directory. If you look at the example inside the container it will launch the Django application on port 8000.&lt;/p&gt;
&lt;p&gt;This tutorial used a very simple Django app in a minimal Docker container. Imagine to use your own container and have your team working and remote debugging on it using VS Code.&lt;/p&gt;
&lt;p&gt;All you have to do is to define a proper &lt;em&gt;devcontainer.json&lt;/em&gt; for your environment and use the Docker image of your choice with your configuration.&lt;/p&gt;
&lt;h2 id="3-other-remote-debugging-scenarios"&gt;3. Other Remote Debugging Scenarios&lt;/h2&gt;
&lt;p&gt;There are also other use cases for remote debugging that are covered by other VS Code extensions.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll not go into much details here, but I think that it&amp;#8217;s useful to know that these extensions exist.&lt;/p&gt;
&lt;h3 id="wsl"&gt;WSL&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.microsoft.com/windows/wsl/install-win10"&gt;Windows Subsystem for Linux&lt;/a&gt; is a feature in Windows 10 that will let you to install a complete Linux distribution (e.g. Ubuntu 18.04) in your local Windows 10 installation. The Linux and Windows installations will be isolated, so you cannot run and debug an application running in WSL directly from VS Code, if running on Windows.&lt;/p&gt;
&lt;p&gt;You need the &lt;a href="https://code.visualstudio.com/remote-tutorials/wsl/getting-started"&gt;Remote WSL&lt;/a&gt; extension to remotely debug your application running in WSL, as it was local.&lt;/p&gt;
&lt;h3 id="liveshare"&gt;LiveShare&lt;/h3&gt;
&lt;p&gt;While technically this feature cannot be considered “remote debugging”, it is worth knowing that VS Code has a &lt;a href="https://docs.microsoft.com/en-us/visualstudio/liveshare/use/vscode"&gt;LiveShare&lt;/a&gt; feature that will let you share a debugging session with one or more colleagues.&lt;/p&gt;
&lt;p&gt;You can think of it as a sort of “video conference” session where one developer is the host and he can share his VS Code window with other people.&lt;/p&gt;
&lt;p&gt;Actually this feature is more powerful than a simple video conference session because for instance you&amp;#8217;ll be able to debug the code concurrently, by inspecting different variables or files independently without having to negotiate control.&lt;/p&gt;
&lt;h2 id="4-conclusion"&gt;4. Conclusion&lt;/h2&gt;
&lt;p&gt;In this tutorial you learned how to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connect with VS Code to a remote server using SSH and remotely debug a web project.&lt;/li&gt;
&lt;li&gt;Run a Docker container within VS Code and debug a project inside the container.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using the correct tools you&amp;#8217;ll never resort to wild debugging sessions over SSH using vim or nano. No more &lt;code&gt;print("I'm here")&lt;/code&gt; to catch those nasty bugs! Now you learned how to use a full featured IDE for remote debugging.&lt;/p&gt;
&lt;p&gt;I want to publicly thank &lt;a href="https://twitter.com/gahjelle"&gt;Geir Arne Hjelle&lt;/a&gt; who helped me in shaping up the outline of this tutorial.&lt;/p&gt;</content><category term="web"></category><category term="debug"></category><category term="django"></category><category term="docker"></category><category term="ssh"></category><category term="vscode"></category></entry></feed>