{"componentChunkName":"component---src-templates-post-jsx","path":"/017-debug-django-with-docker-vs-code/","result":{"data":{"markdownRemark":{"html":"<ol>\n<li>Install <code class=\"language-text\">ptvsd</code> as a dev dependency. The latest version at the time of writing is 4.3.2, but\ncheck it <a href=\"https://pypi.org/project/ptvsd/\">here</a>.</li>\n<li>Add an environment variable to control enabling <code class=\"language-text\">ptvsd</code>. I opted for using <code class=\"language-text\">VSCODE_DEBUGGER</code> as\npart of our docker-compose <code class=\"language-text\">env-file</code>.</li>\n<li>Connect the <code class=\"language-text\">ptvsd</code> server in your <code class=\"language-text\">manage.py</code>. I do this just before the standard call to\n<code class=\"language-text\">execute_from_command_line(sys.argv)</code>, like so:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">  <span class=\"token triple-quoted-string string\">\"\"\"\n  Django runs twice to support live-reloading! In order to support live-reloading files and\n  attaching to the correct process, we use a bit of Django's internals to check if we need to\n  start up our debugger.\n\n  See:\n  - https://github.com/django/django/blob/master/django/utils/autoreload.py#L26\n  - https://ytec.nl/blog/debugging-django-vscode-without-using-noreload/\n  \"\"\"</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"RUN_MAIN\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">or</span> os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"WERKZEUG_RUN_MAIN\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">and</span> os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>\n      <span class=\"token string\">\"VSCODE_DEBUGGER\"</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n      <span class=\"token keyword\">import</span> ptvsd  <span class=\"token comment\"># noqa</span>\n\n      ptvsd_port <span class=\"token operator\">=</span> <span class=\"token number\">4000</span>\n\n      <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n          ptvsd<span class=\"token punctuation\">.</span>enable_attach<span class=\"token punctuation\">(</span>address<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"0.0.0.0\"</span><span class=\"token punctuation\">,</span> ptvsd_port<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> redirect_output<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n          <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Started ptvsd at port %s.\"</span> <span class=\"token operator\">%</span> ptvsd_port<span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">except</span> OSError<span class=\"token punctuation\">:</span>\n          <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ptvsd port %s already in use.\"</span> <span class=\"token operator\">%</span> ptvsd_port<span class=\"token punctuation\">)</span></code></pre></div>\n<ol start=\"4\">\n<li>Expose the port for the <code class=\"language-text\">ptvsd</code> server. With docker-compose, you can add the port to the port\nmappings section, like so:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">version: &quot;3&quot;\nservices:\n  ... # Redacted for simplicity!\n\n  # Django application\n  app:\n    ... # Redacted for simplicity!\n    ports:\n      - &quot;8000:8000&quot; # django application portundefined you probably already have this\n      - &quot;4000:4000&quot; # ptvsd port for debugging</code></pre></div>\n<ol start=\"5\">\n<li>\n<p>Set up the configuration for VS Code in <code class=\"language-text\">.vscode/launch.json</code>. You'll probably need to tweak the\n<code class=\"language-text\">remoteRoot</code> configuration. Note that I've opted to use port 4000, as it doesn't conflict with my\nnormal port usage.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n <span class=\"token property\">\"version\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"0.2.0\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token property\">\"configurations\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n   <span class=\"token punctuation\">{</span>\n     <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"[django:docker] runserver\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"python\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"request\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"attach\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"pathMappings\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n       <span class=\"token punctuation\">{</span>\n         <span class=\"token property\">\"localRoot\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"${workspaceFolder}\"</span><span class=\"token punctuation\">,</span>\n         <span class=\"token property\">\"remoteRoot\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"/app\"</span>\n       <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"port\"</span><span class=\"token operator\">:</span> <span class=\"token number\">4000</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">\"host\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"localhost\"</span>\n   <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n</li>\n<li>Document it! Here's a starter snippet for your README:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"markdown\"><pre class=\"language-markdown\"><code class=\"language-markdown\"><span class=\"token title important\"><span class=\"token punctuation\">##</span> Debugging with Docker and VSCode</span>\n\nSupport for debugging remotely if you're running with Docker is supported out-of-the-box.\n\nTo debug with Docker:\n\n<span class=\"token list punctuation\">1.</span> Set the <span class=\"token code keyword\">`VSCODE_DEBUGGER`</span> value to <span class=\"token code keyword\">`True`</span> in your docker.local.env\n\n<span class=\"token list punctuation\">2.</span> Rebuild and run your Docker containers as usual: <span class=\"token code keyword\">`docker-compose up --build`</span>\n\n<span class=\"token list punctuation\">3.</span> Start the debug session from VS Code for the <span class=\"token code keyword\">`[django:docker] runserver`</span> configuration\n\n   <span class=\"token list punctuation\">1.</span> Open up the debugger by by pressing <span class=\"token code keyword\">`⌘-⇧-d`</span>, or using the Command Palette and selecting\n      <span class=\"token code keyword\">`View: Show Run and Debug`</span>.\n\n   <span class=\"token list punctuation\">2.</span> Select <span class=\"token code keyword\">`[django:docker] runserver`</span> from the dropdown near the Play button in the top left.\n\n   <span class=\"token list punctuation\">3.</span> Hit the Play button or hit <span class=\"token code keyword\">`F5`</span> to start debugging\n\n<span class=\"token code keyword\">      - Logs will redirect to your integrated terminal as well.</span>\n\n<span class=\"token list punctuation\">4.</span> Set some breakpoints!\n\n   <span class=\"token list punctuation\">-</span> You can create a breakpoint by clicking to the left of a line number. When that code is\n     executed, the debugger will pause code execution so you can inspect the call stack and\n     variables. You can either resume code execution or manage code execution manually by stepping\n     into the next pieces of code, or over them.</code></pre></div>","timeToRead":2,"excerpt":"Install  as a dev dependency. The latest version at the time of writing is 4.3.2, but\ncheck it here. Add an environment variable to control…","frontmatter":{"title":"Adding Debug Support to Django with Docker and VS Code","cover":"https://images.unsplash.com/photo-1580792442187-93e20f48fa5a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1650&q=80","date":"2020-05-01","category":"tech","tags":["python","django","docker","vs-code"]},"fields":{"slug":"/017-debug-django-with-docker-vs-code/","date":"2020-05-01T06:00:00.000Z"}}},"pageContext":{"slug":"/017-debug-django-with-docker-vs-code/"}}}