Cada vez que ejecuto un depurador suceden muchas cosas, pero no lo que espero.
Estoy ejecutando un proyecto con docker-compose up
Comprobando el host local si el backend backend está bien. Está abajo. Lo curioso es que el contenedor se está ejecutando porque estoy conectado a esto con los contenedores remotos de vscode.
La biblioteca debugpy está instalada.
El primer enfoque para ejecutar un depurador finaliza con dicha información en la consola de depuración:
Attached! System check identified some issues: WARNINGS: workflow.State.additional_values: (fields.W904) django.contrib.postgres.fields.JSONField is deprecated. Support for it (except in historical migrations) will be removed in Django 4.0. HINT: Use django.db.models.JSONField instead. Operations to perform: Apply all migrations: accounts, auth, contenttypes, files, mambu, otp_totp, sessions, token_blacklist, workflow, zoho Running migrations: No migrations to apply.y está abajo. El backend también está caído.
Segundo intento:
Attached! System check identified some issues: WARNINGS: workflow.State.additional_values: (fields.W904) django.contrib.postgres.fields.JSONField is deprecated. Support for it (except in historical migrations) will be removed in Django 4.0. HINT: Use django.db.models.JSONField instead. Zoho Configuration failed, check that you have all variables ZOHO_TOKEN_URL, ZOHO_REST_API_KEY, ZOHO_CURRENT_USER_EMAILy está inactivo pero el backend está activo: puedo iniciar sesión, etc.
El tercer intento termina con un error de este tipo connect ECONNREFUSED 127.0.0.1:5678 .
¿Algun consejo?
Código:
gestionar.py
#!/usr/bin/env python """Django's command-line utility for administrative tasks.""" import os import sys def initialize_debugger(): import debugpy debugpy.listen(("0.0.0.0", 5678)) debugpy.wait_for_client() print('Attached!') def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxx.settings") try: from django.core.management import execute_from_command_line except ImportError as exc: raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?" ) from exc execute_from_command_line(sys.argv) if __name__ == "__main__": initialize_debugger() main()El docker-compose.yml local
version: "3.2" services: backend: container_name: xxx build: context: ./backend dockerfile: ../build/backend.Dockerfile volumes: - ./backend:/opt/app command: ./run.sh ports: - "8000:8000" - "5678:5678" env_file: - build/.env-local links: - db:db - rabbit:rabbit - memcached:memcached celery: container_name: xxx restart: always build: dockerfile: ../build/backend.Dockerfile context: ./backend command: ./run_celery.sh env_file: - build/.env-local working_dir: /opt/app/ volumes: - ./backend/:/opt/app links: - db:db - rabbit:rabbit frontend: container_name: xxx build: context: frontend dockerfile: ../build/frontend.Dockerfile environment: - BROWSER=none - CI=true volumes: - ./frontend/src/:/frontend/src - ./frontend/public/:/frontend/public nginx: container_name: xxx build: dockerfile: build/nginx.Dockerfile context: . args: REACT_APP_GOOGLE_ANALYTICS_TOKEN: $REACT_APP_GOOGLE_ANALYTICS_TOKEN REACT_APP_PAGESENSE_LINK: $REACT_APP_PAGESENSE_LINK REACT_APP_CHATBOT_TOKEN: $REACT_APP_CHATBOT_TOKEN REACT_APP_SENTRY_DSN: $REACT_APP_SENTRY_DSN REACT_APP_SENTRY_ENVIRONMENT: $REACT_APP_SENTRY_ENVIRONMENT REACT_APP_SENTRY_TRACES_SAMPLE_RATE: $REACT_APP_SENTRY_TRACES_SAMPLE_RATE REACT_APP_THIRD_PARTY_API_URL: $REACT_APP_THIRD_PARTY_API_URL ports: - "5000:80" depends_on: - backend - frontend env_file: - build/.env-local volumes: - ./build/nginx/nginx.conf:/etc/nginx.conf db: container_name: xxx image: postgres:12 ports: - "5432:5432" restart: on-failure environment: POSTGRES_DB: postgres POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres rabbit: container_name: xxx image: rabbitmq ports: - "5672:5672" memcached: container_name: xxx image: memcached ports: - "11211:11211" restart: always flower: image: mher/flower:0.9.5 environment: - CELERY_BROKER_URL=amqp://xxx-rabbitmq// - FLOWER_PORT=8888 ports: - 8888:8888y el lanzamiento.json
{ "version": "0.2.0", "configurations": [ { "name": "CF: Remote Attach", "type": "python", "request": "attach", "connect": { "host": "localhost", "port": 5678 }, "pathMappings": [ { "localRoot": "${workspaceFolder}/backend", "remoteRoot": "/opt/app/" } ], "django": true } ] }Django no admite la depuración por sí solo
esto es lo que encontre de surfear en 2 min
Puede haber muchas razones por las que la depuración no funciona según lo previsto. La solución de problemas suele ser lo más razonable. Comenzando con algo simple y agregando complejidad hasta descubrir qué paso no está funcionando como se esperaba. Recomendaría comenzar con una sesión de depuración simple usando pdb , antes de agregar la complejidad de VS Code. Para lograr eso, solo necesita agregar un punto de breakpoint() en su código de back-end donde desea depurar. En su docker-compose.yaml , desea agregar a su servicio de backend -end, las siguientes configuraciones adicionales
services: backend: - tty: true - stdin_open: true En su terminal, inicie su aplicación con docker-compose up . Abra una segunda terminal y adjúntela a su contenedor con la docker attach <project name>_backend . Normalmente debería recibir un aviso pdb> en la ubicación donde se alcanzó el breakpoint de interrupción.
Según su descripción, estos son los puntos que investigaría.
Asegúrese de que debugpy esté instalado en la imagen de Docker y no localmente.
Supongo que está utilizando python manage.py runserver 0.0.0.0:8000 para iniciar el servidor HTTP WSGI. En caso de que esté usando algo como gunicorn, vale la pena mencionar que solo debe usar 1 trabajador. Como ejemplo, si usa gunicorn, puede proporcionar la cantidad de trabajadores en la línea de comando: gunicorn --workers=1 --timeout=1200 --bind 0.0.0.0:8000 your_application.wsgi:application .
Tenga en cuenta también el gran tiempo de espera. Es posible que desee establecer un valor alto tanto para su servidor HTTP WSGI como para Nginx. Si se agota el tiempo de espera de uno de ellos mientras realiza la depuración, obtendrá un error 502 o 504 dependiendo de cuál agotó el tiempo de espera primero y su sesión de depuración finalizará.
Por lo general, coloco el código que importa debugpy en wsgi.py , justo antes de la llamada a get_wsgi_application()
""" WSGI config for {{ project_name }} project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') import debugpy debugpy.listen(('0.0.0.0', 5678)) debugpy.wait_for_client() print('Attached!') application = get_wsgi_application()