Debug remoto en Django con Docker y VS Code

Con el uso de contenedores virtualizados con Docker, el proceso de debug ha cambiado un poco. Ahora debemos conectarnos a las instancias virtualizadas para poder hacer debug de nuestro código, y a veces no es tan sencillo como parece.

En este caso explicaré cómo configuro normalmente mi entorno con VS Code para hacer debug remoto para el desarrollo de mis aplicaciones Django bajo Docker.

1uFOXOycdz17QphtnBCpHfQ

VS Code ya tiene una extensión de Docker que facilita las cosas. Soporta Node.js, Python y .NET Core.

Si abrimos la pestaña de docker, ya deberíamos ver un resumen con los contenedores, imágenes y demás.

El primer paso es añadir el módulo ptvsd (Python Tools for Visual Studio debug server) en nuestro fichero requirements.txt

ptvsd == 4.3.2

La versión 5 lleva tiempo en alpha, por lo que te recomiendo mirar en el repositorio oficial.

Ahora debes modificar el fichero launch.json de VS Code con este contenido:

{
"name": "Python: Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"console": "integratedTerminal",
"args": [
"runserver",
"0.0.0.0:8000",
],
"django": true
},

Lo siguiente es modificar el fichero manage.py para añadir las siguientes lineas:

if settings.DEBUG:    
if os.environ.get('RUN_MAIN') or os.environ.get('WERKZEUG_RUN_MAIN'):
    import ptvsd
    ptvsd.enable_attach(address = ('0.0.0.0', 3000))
    print "Attached remote debugger"

Django hace live reload de manera que actualiza cada vez que detecta cambios en el código mientras trabajamos. El segundo if es para evitar que se inicialice dos veces.

El fichero manage.py (en mi caso con Django 3) quedaría de la siguiente forma:

El siguiente paso es asegurar que tenemos abierto el puerto 3000 desde Docker. En el caso de docker-compose.yml, yo tengo:

...
services:
...
web:
ports:
- "8000:8000"
- "3000:3000"

Instala también la extensión ms-python.python

2 1

Una vez hecho esto, ya deberíamos poder lanzar la instancia con nuestra configuración de debug. Deberíamos tener el perfil Python: Django (creado en el fichero launch.json) disponible en la pestaña de debug de VSCode, y basta con darle al play para que todo arranque.

3 1

Si lo hemos hecho bien, podremos ver como aparece “Dev Container: Existing Docker Compose…” en la parte inferior, lo cual nos indica que estamos conectados al contenedor Docker a través de VSCode y tenemos todo listo para debugar. En la siguiente captura podemos ver también el print del mensaje “Attached remote debugger” que hemos puesto en el manage.py.

4 3