2017-06-20 2 views
1

Ich entwickle eine Flask-App mit Google App Engine und teste sie auf meinem lokalen Computer mit dem lokalen Entwicklungsserver (z. B. dev_appserver.py).Anzeigen von Python-Tracebacks von Google App Engine im lokalen Entwicklungsserver aufgrund eines Fehlers in der Flask-Route

Wenn meine App eine Laufzeitausnahme auf der obersten Ebene des app.py-Skripts feststellt, sehe ich das Traceback im Terminal unter dev_appserver.py. Wenn die Ausnahme jedoch innerhalb einer Flask-Route auftritt, scheint es, als ob der Dev-Server die Ausnahme abfängt und verarbeitet. Alles, was ich in der Terminal-Ausgabe sehen kann, ist, dass die Route einen 500-Antwort-Status zurückzugibt:

INFO  2017-06-20 13:18:31,998 devappserver2.py:116] Skipping SDK update check. 
INFO  2017-06-20 13:18:32,025 api_server.py:297] Starting API server at: http://localhost:43843 
INFO  2017-06-20 13:18:32,037 dispatcher.py:209] Starting module "default" running at: http://localhost:8080 
INFO  2017-06-20 13:18:32,037 admin_server.py:116] Starting admin server at: http://localhost:8000 
INFO  2017-06-20 13:18:36,048 module.py:809] default: "GET /cron/batch/basket HTTP/1.1" 500 291 

Ein hacky Weg I ist die Zurückverfolgungs lokalisieren kann durch dev_appserver.py das Flag --logs_path=sqlite.db vorbei und dann den Inhalt der AppLogs Tabelle sieht in die SQLite-Datei, die das Traceback enthält. Aber das ist kaum ein nützlicher Arbeitsablauf.

Wer weiß, wie ich die Rückverfolgung für eine Ausnahme im Umgang mit einer Flask-Route bekommen kann?

+0

I 'dev_appserver.py' in einem Terminal-Fenster starten und die Protokolle in diesem Fenster streamen. Standardmäßig enthalten die Protokolle dort alle Tracebacks. Was genau sehen Sie im Terminalfenster? –

+0

Interessant. Ich habe die Frage mit der Ausgabe aktualisiert, die die Startprotokollierung und die GET-Anforderung an die Route mit dem Fehler enthält. – nedned

+0

Das ist, wo ich Tracebacks sehe. Fügen Sie Ihrem Code "assert False" hinzu und prüfen Sie, ob dadurch ein Traceback angezeigt wird. –

Antwort

0

Meine Lösung für dieses Problem ein Dekorateur zu schaffen war, die jede Ausnahme abfängt, druckt seine Zurückverfolgungs auf stdout, und dann wieder wirft die Ausnahme, die ich hinzufügen, dann auf welche auch immer Routen Ich mag debug:

import traceback 
import sys 

def print_traceback(func): 
    """Decorator that prints exception tracebacks to stdout""" 
    def wrapper(*args, **kwargs): 
     try: 
      return func(*args, **kwargs) 
     except Exception, e: 
      print "Exception:" 
      print "=============================" 
      traceback.print_exc(file=sys.stdout) 
      print "=============================" 
      raise e 
    return wrapper 

@app.route('/some/route') 
@print_traceback 
def some_route(task): 
    pass 
1

Etwas Ähnliches könnte helfen:

app = Flask(__name__) 

production_environment = os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/') 

if not production_environment: 
    app.debug = True 
Verwandte Themen