2012-08-12 16 views
7

Ich versuche, einen Fehler in einer Dekorateur Funktion loggen app.logger.error('') verwenden, aber es funktioniert einfach nicht. Darüber hinaus kann nicht ich diese gut debug und ich kann nur die Antwort von dem HTTP-Client sehen:Protokollieren von Fehlern mit Kolben

(Ich bin mit nginx + uwsgi + Kolben)

HTTP/1.1 502 Bad Gateway

Server: nginx

Datum: Sun, 12. August 2012 15.45.09 GMT

Content-Type: text/html

Content-Length: 14

Verbindung: Keep-Alive-

Alles funktioniert super mit aus der Leitung: app.logger.error('panic !!!')

def mydecorator(): 
    def decorator(f): 
     def wrapped_function(*args, **kwargs): 
      try: 
       ip = Mytable.query.filter_by(ip=request.remote_addr).first() 
      except: 
       app.logger.error('panic !!!') 
      else: 
       dootherthing() 

      resp = make_response(f(*args, **kwargs)) 
      h = resp.headers 
      h['add-this-header'] = ":)" 
      return resp 
     return update_wrapper(wrapped_function, f) 
    return decorator 

Es scheint, dass es aus dem Zusammenhang gerissen oder etwas ist.

Antwort

9

in der Tat, der Dekorateur nicht gelungen, aus dem Zusammenhang die App-Instanz zu erkennen, ich dies mit CURRENT_APP lösen:

1st. Importieren Sie die Methode: from flask import current_app

zweiten. anhängen jede App-Klasse CURRENT_APP:.. current_app.logger.error('panic !!!')

info @http://flask.pocoo.org/docs/api/#flask.current_app

„verweist auf die Anwendung die Anforderung Handhabung Dies ist nützlich für Erweiterungen, die mehrere Anwendungen laufen neben Seite unterstützen möchten Dies ist angetrieben durch den Anwendungskontext und nicht durch den Anforderungskontext, so dass Sie den Wert dieses Proxy ändern können, indem die app_context() Methode verwendet wird.“

0

Ist app überall im Skript definiert, die Sie gepostet haben?

Auch beim Debuggen sollten Sie beim Testen die run()-Methode mit debug mode verwenden.

app.run(debug=True) 
+0

ich kippe, verwendet der Kolben App environ Vars von nginx und wenn ich es im Debug-Modus laufen friert es – Alvarolm

+2

@Alvarolm: Vielleicht sollten Sie so neu zu gestalten, die Anwendung der Ansicht, dass Sie die App ein Skript aus dem Befehl ausgeführt werden können Linie. Dies ermöglicht es Ihnen, zu Testzwecken im Debug-Modus zu laufen. Andernfalls werden Sie viel Zeit damit verbringen, Code zu debuggen, ohne eine klare Vorstellung davon zu haben, was falsch ist. –

+0

das ist ein Tuff Entscheidung, btw app.debug = True tut funktioniert auch – Alvarolm