web-dev-qa-db-fra.com

Flask - Comment créer du code abort () personnalisé?

Le flacon a un bon gestionnaire d’erreur en utilisant abort() ou lorsque l’erreur est réellement survenue. 

Dans la documentation Flask, il existe un exemple de gestionnaire d'erreur 404:

@app.errorhandler(404)
def not_found(error):
    return render_template('404.html'), 404

J'ai donc essayé de créer un code d'erreur personnalisé comme 

if False:
    abort(777)

@app.errorhandler(777)
def something_is_wrong(error):
    return render_template('777.html'), 777

Mais cela ne fonctionne pas et le débogueur Werkzeug dit: LookupError: aucune exception pour 777

J'ai trouvé cette question qui dit que je devrais le faire comme ceci:

if False:
    return '777 error', 777

Malheureusement, le code ci-dessus produit un écran blanc, même le débogueur Werkzeug ne sort pas

Je sais que je peux simplement faire:

if False:
    return render_template('777.html')

Mais cela rendra le code plus propre si j'utilise la fonction abort(). Est-il possible de créer un code d'erreur personnalisé?

26
hrsetyono

La liste des codes de statut HTTP possibles est fixée par l'autorité Internet Assigned Numbers Authority. Vous ne pouvez donc pas en ajouter un personnalisé. Werkzeug le reconnaît et essaie de vous empêcher d'envoyer un code sans signification au navigateur. Parcourez la liste des codes d'état pour en trouver un qui corresponde à votre erreur et utilisez-la.

Édition: Ajout de codes d’état à Werkzeug/Flask

import werkzeug.exceptions as ex
from flask import Flask, abort

class PaymentRequired(ex.HTTPException):
    code = 402
    description = '<p>You will pay for this!</p>'

abort.mappings[402] = PaymentRequired

app = Flask(__name__)

@app.route('/')
def mainpage():
    abort(402)

@app.errorhandler(402)
def payme(e):
    return 'Pay me!'

app.run()
30
Abe Karplus

En fonction de la lecture de la question, cela peut être utile.

Il existe un moyen plus simple d'ajouter le traitement des pages d'erreur client pour une exception spécifique. Pour ce faire, procédez comme suit:

class MyCustom404(Exception):
    pass

@app.errorhandler(404)
def page_not_found(error):
    return render_template("errors/404.html"), 404

@app.errorhandler(MyCustom404)
def special_page_not_found(error):
    return render_template("errors/custom_404.html"), 404

... puis déclenchez votre nouveau gestionnaire lorsque vous en avez besoin avec

raise MyCustom404

Voir les docs ici .

11
Andrew Barrett

Dans mon cas, Flask == 0.11.1 Werkzeug == 0.11.10

J'utilise avorter le code de statut http 451 par exemple.

si vous souhaitez utiliser abort () avec un code, un nombre entier, comme abort (451), vous devez tout d'abord créer un HTTPException personnalisé, une sous-classe de HTTPException.et ajouter votre HTTPException à default_exceptions.

from werkzeug.exceptions import HTTPException, default_exceptions,  Aborter
class UnavailableForLegalReasons(HTTPException):
    code = 451
    description = 'BIG BROTHER IS WATCHING YOU'

default_exceptions[451] = UnavailableForLegalReasons
abort = Aborter()  # don't from flask import abort

@app.errorhandler(451)
def uflr(e):
    return e, 451

@app.route('/debug')
def debug():
    abort(451)

ensuite, lorsque vous accédez au chemin dans le navigateur, vous pouvez regarder ceci  enter image description here

mais la phrase de raison http est UNKNOWN, 

tu peux le changer

from werkzeug.http import HTTP_STATUS_CODES
HTTP_STATUS_CODES[451] = 'Unavailable For Legal Reasons'  # or even empty

 enter image description here

6
xavierskip

Vous pouvez également utiliser Flask API et son système de traitement des erreurs:

http://www.flaskapi.org/api-guide/exceptions/

0
Mathieu Rodic