2012-09-05 24 views
18

Flask tiene un buen controlador de errores usando abort() o cuando el error ocurrió realmente.Frasco: cómo crear código abort() personalizado?

De la documentación frasco no es un ejemplo para el error manejador 404:

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

tanto, he intentado crear un código de error personalizado como

if False: 
    abort(777) 

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

Pero no funciona y el depurador Werkzeug dice : LookupError: ninguna excepción para 777

Encontré this question que dice que debo hacerlo así:

if False: 
    return '777 error', 777 

Por desgracia, el código anterior producen de pantalla blanco, incluso el depurador Werkzeug no sale

Sé que puedo hacer simplemente:

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

Pero va a hacer el código más limpio si Yo uso el abort(). ¿Hay alguna forma de crear un código de error personalizado?

Respuesta

24

La lista de posibles códigos de estado HTTP está fijada por la Autoridad de números asignados de Internet, por lo que no puede agregar una personalizada. Werkzeug lo reconoce e intenta evitar que envíe un código sin sentido al navegador. Consulte el list of status codes para encontrar uno que coincida con su error y use ese.

Editar: Adición de códigos de estado a Werkzeug/Frasco

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() 
+0

Gracias, lo usan de error 400 bad_request para cuando el usuario ingresó manualmente el valor incorrecto en la URL (porque la URL contiene información del usuario de la lista desplegable). ** Funciona, pero ¿es el correcto? ** – hrsetyono

+1

Probablemente, depende de por qué rechaza la entrada. Otro código apropiado/común podría ser 404, o tal vez incluso 403 si está bloqueando por razones de seguridad. –

+2

¿Qué hay de 402? Ese no está definido en werkzeug pero debería ser válido. – Pwnna

10

Dependiendo de la lectura de la pregunta que esto podría ser útil.

Existe una manera más fácil de añadir un manejo página de error al cliente para una excepción específica, se puede hacer esto:

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 

... y dispare su nuevo manejador cuando lo necesite con

raise MyCustom404 

Ver el docs here.

4

En mi caso, Frasco == == 0.11.1 Werkzeug 0.11.10

utilizo abortar el estado HTTP código 451 por ejemplo.

si desea utilizar abort() con un código, un número int, como abort (451), al principio debe crear una HTTPException personalizada, una subclase de HTTPException.and anexar su HTTPException a 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) 

a continuación, cuando se accede a la ruta en el navegador, se puede ver este enter image description here

pero la frase razón http es desconocido,

Si desea cambiarlo,

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

enter image description here