Wie kann ich das implementieren einer benutzerdefinierten error-handler für alle HTTP-Fehler in Fläschchen?
In meinem Kolben-app kann ich problemlos erweitern Sie die Liste der Fehler behandelt, die von einer einzelnen benutzerdefinierten error-handler durch hinzufügen errorhandler
Dekorateure für jeden error-code als mit
@application.errorhandler(404)
@application.errorhandler(401)
@application.errorhandler(500)
def http_error_handler(error):
return flask.render_template('error.html', error=error), error.code
Allerdings erfordert dieser Ansatz eine explizite Dekorateur für jeden Fehlercode. Gibt es eine Möglichkeit, schmücken meine (einzige) http_error_handler
- Funktion, so dass es behandelt alle HTTP-Fehler?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist nicht die einzige, die eine Problemumgehung wird die Angabe der Liste der http-Fehler-code, den Sie fangen und an den Anwendung.error_handler_spec, und legen Sie die Dekoratoren, wie diese:
Nicht ideal und hässlich ich weiß, aber es funktioniert und ich hoffe jemand anderes kann kommen mit einer besseren Lösung. Hoffe, das hilft.
error_handler_spec
. Ist das wirklich die einzige Möglichkeit (bis jetzt)?Können Sie die
errorhandler
Dekorator mit einem exception-Klasse eher als ein Fehler-code als argument, wie beschrieben hier. So könnte man versuchen, zum Beispielbehandelt werden alle HTTP-Fehler " (was vermutlich bedeutet, dass alle HTTP-Fehler-codes), oder auch
behandeln alle nicht abgefangene Ausnahmen
Edit: angeschaut auf der Kolben-source-code, es ist ein 'TRAP_HTTP_EXCEPTIONS' - flag in der config app, die Sie ändern können (indem zum Beispiel
app.config['TRAP_HTTP_EXCEPTIONS']=True
).(In etwa), Wenn das flag false ist, Ausnahmen die Instanzen von HTTPException behandelt werden die Funktionen, die Sie haben dekoriert mit
errorhandler(n)
won
ist ein HTTP-Fehler-code; und wenn dieses flag true ist, werden alle Instanzen von HTTPException stattdessen behandelt, indem die Funktionen, die Sie haben dekoriert miterrorhandler(c)
, wobei c eine exception-Klasse.Damit
erreichen, was Sie wollen.
Da es aussieht wie HTTPException hat Unterklassen für jede HTTP-Fehler-code (siehe hier), Einstellung 'TRAP_HTTP_EXCEPTIONS' und dekorieren Sie Ihre Fehler-Handler für exception-Klassen, die nicht Fehler-codes sieht aus wie ein streng flexiblere Art und Weise, Dinge zu tun.
Referenz, mein Kolben error-handling nun aussieht:
Klappt alles was ich will, und scheint, um alle Fehler, sowohl über HTTP als auch interne. Die
if e.code < 400
bisschen ist es auf flask ' s Standard-Verhalten für Umleitungen und dergleichen (sonst diejenigen, die am Ende als Fehler 500s, das ist nicht, was Sie wollen)Für mich, den folgenden Schnipsel nicht funktioniert :
Aber ändern
HTTPException
auf die Reale, wieNotFound
war, arbeitete. Frag mich nicht warum, ich habe die Antwort nicht finden.Also habe ich eine alternative gefunden Lösung, die funktioniert ziemlich gut:
(Gefunden bei Github)