2012-11-03 11 views
7

Anfangs hatte ich eine Django App mit dem mitgelieferten Testserver. Um dieses Setup zu debuggen, kann ich einfach eine import pdb; pdb.set_trace() irgendwo im Code hinzufügen und habe einen Bruchpunkt, der mich in einen interaktiven Debugger in Terminal (auf der Kommandozeile) wirft.Django Gunicorn Debug

Kürzlich wechselte ich zu Gunicorn, um einige Vorteile zu erhalten. Wie kann ich bei der Verwendung dieses Gunicorn-Setups ein ähnliches Verhalten erzielen? Ich habe versucht, indem ich gunicorn Einstellungen mit debug=True und einstelle, aber es funktioniert nicht.

Hat jemand eine Lösung?

+0

Haben Sie herausfinden, wie es funktioniert? – duduklein

+0

Ja, bitte lesen Sie meine Antwort. das mache ich jetzt ... –

+0

Ich habe es geschafft, gunicorn und ipdb zusammen zu benutzen. Siehe meine Antwort unten. Ich schlage auch vor, das Timeout auf einen größeren Wert zu setzen, damit Sie Zeit zum Debuggen haben. – duduklein

Antwort

4

grünes Einhorn in einer Reverse-Proxy-Konfiguration auszuführen (unter nginx) in einem Debugger/Debug-Modus, geben Sie die folgenden Einstellungen in PyCharm ‚s Run/Django/bearbeiten Konfigurationen:

Natürlich verwenden, was Port (anstelle von 7777) haben Sie Ihren Nginx als Proxy konfiguriert.

Screenshot

+1

was mit GUI für Python: D ? – holms

+0

Das hilft nicht wirklich. op möchte 'pdb' verwenden, nicht PyCharms GUI um zu debuggen. – WhyNotHugo

2

Wenn Sie in der Lage sind, sich auf einer application Instanz gestartet werden soll gunicorn zeigen, dass eine Instanz der Klasse DebuggedApplication aus der werkzeug Bibliothek ist, werden Sie in der Lage sein, Bruchstellen, um den Debugger mit werkzeug import ipdb; ipdb.set_trace() direkt in Ihrem Browser.

import django.core.handlers.wsgi 
from werkzeug.debug import DebuggedApplication 

application = django.core.handlers.wsgi.WSGIHandler() 
application = DebuggedApplication(application, evalex=True) 

Stellen Sie sicher, dass Sie Bibliothek und ipdb natürlich installieren. (pip install werkzeug und pip install ipdb)

+0

das hat nicht funktioniert – duduklein

+0

@ calvin-cheng: Nicht sicher, wie das funktionieren soll. Zuerst sollte ich eine unbehandelte Ausnahme bekommen, damit der Werzeug Traceback Debugger in der UI (d. H. Web Browser) sichtbar wird. Das funktioniert. Von ihnen Kommandozeile in der Benutzeroberfläche rufe ich import ipdb; ipdb.set_trace(). Dies verursacht eine Ausnahme, sieht für mich aus, dass ipdb seine Konsole nicht mag (es scheint eine HTML * -Klasse zu sein, die nicht völlig falsch klingt, wenn sie im Browser funktionieren sollte.) –

0

Was ich schließlich getan habe, läuft python manage.py runserver <your_external_IP>:8000, wenn ich pdb verwenden möchte.

So müssen Sie 2 verschiedene Repositories in der gleichen Maschine haben, eine LIVE-Produktion bauen (die eine läuft gunicorn) und die andere ist die TEST-Build, die ich brauche zu debuggen wo ich pdb verwenden. Wenn die Dinge bei TEST Build stabil erscheinen, füge ich die TEST branch mit LIVE branch zusammen. Keine Entwicklung oder Änderungen passieren auf LIVE branch so vermeide ich Konflikte bei der Zusammenführung.

Hoffentlich hilft anderen, die pdb süchtig;)

+0

danke für die Freigabe Ihrer Lösung. Ich schätze es. Ich schaffte es, es zum Laufen zu bringen und teilte auch mein. – duduklein

+2

Dies funktioniert tatsächlich _NOT_ funktioniert, wenn Sie https Reverse-Proxy (z. B. nginx) haben – Kimvais

+0

@Kimvais ja Sie sind richtig. Wenn Sie wissen, wie dies in Gegenwart eines Reverse-HTTP-Proxy zu tun, bin ich interessiert, die Einrichtung zu wissen ... –

2

ich jetzt mit djnago und IPDB zu verwenden gunicron verwaltet.

Lauf python -m ipdb manage.py run_gunicorn --debug -t 3600

Ich verwende Django 1.4 und 0.16.1 gunicorn. dann können Sie normalerweise import ipdb; ipdb.set_trace() im Code verwenden. Die Bibliothek werkzeug ist nicht erforderlich.

Ich versuche, einen Facebook-App zu debuggen, so kann ich nicht den Bau in der Entwicklungs-Server verwenden, da Facebook SSL und den dev-Server verwenden versucht reagieren kann einfach nicht richtig

Während ich war auf der Suche Für eine Lösung habe ich einen Post pdb: Using the Python debugger in Django gefunden, der vorschlägt, die ganze Zeit python -m pdb manage.py runserver zu laufen. Obwohl dies mit djangos dev server nicht nötig ist, habe ich mich entschieden, es mit gunicordn und ipdb zu versuchen und es hat funktioniert.

3

Ok habe ich auf ähnliches Problem vor kurzem stumbed. Ich war nicht in der Lage, @dudklein-Lösung anzuwenden (Ich bekomme I/O-Fehler, während der Debugger versucht hat, Input zu nehmen - ipdb, pdb usw.)

Ich benutzte Remote Python Debbuger - winpdb und es ist embedded debugging.

  1. installiert Winpdb in Ihrem virtualenv

    pip install winpdb 
    
  2. Import und Embedded-Debugger in Ihrem Code ausführen:

    import rpdb2 
    rpdb2.start_embedded_debugger('pass') 
    
  3. Lauf gunicorn mit --timeout Argumente

    gunicorn -t 3600 env:application 
    
  4. Führen Sie die richtige Ansicht mit dem Browser z. mit Winpdb http://127.0.0.1:8000/your-view/

  5. Embedded-Debugger anschließen:

    winpdb -a /path/to/django/app/views.py 
    

    Es Sie nach einem Passwort gefragt wird (ein verwenden Sie in Ihrem Code festgelegt, in meinem Beispiel ist es 'pass') und nette GUI läuft mit Debugger.

  6. Wenn Sie ein Tutorial für winpdb - here You are benötigen.

enter image description here

Verwandte Themen