2012-09-05 10 views
18

Flask ha un buon gestore di errori usando abort() o quando l'errore si è verificato veramente.Flask - Come creare codice abort() personalizzato?

Da documentazione Flask v'è un esempio di errore 404 handler:

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

Così, ho cercato di creare il codice di errore personalizzato come

if False: 
    abort(777) 

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

Ma non funziona e il debugger Werkzeug dice : LookupError: nessuna eccezione per 777

Ho trovato this question che dice che dovrei farlo in questo modo:

if False: 
    return '777 error', 777 

Purtroppo, il codice sopra produrre bianco-schermo, anche il debugger Werkzeug non esce

so di poter semplicemente fare:

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

Ma sarà rendere il codice più pulito, se Io uso il abort(). C'è un modo per creare un codice di errore personalizzato?

risposta

24

L'elenco dei possibili codici di stato HTTP è fissato dall'autorità di numeri assegnati Internet, quindi non è possibile aggiungerne uno personalizzato. Werkzeug lo riconosce e cerca di impedirti di inviare un codice privo di significato al browser. Guarda attraverso lo list of status codes per trovare quello che corrisponde al tuo errore e usa quello.

Edit: Aggiunta di codici di stato per 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() 
+0

Grazie, utilizzo l'errore 400 bad_request per quando l'utente ha digitato manualmente un valore errato nell'URL (perché l'URL contiene l'input dell'utente dall'elenco a discesa). ** Funziona, ma è quella giusta? ** – hrsetyono

+1

Probabilmente, dipende dal motivo per cui stai rifiutando l'input. Un altro codice appropriato/comune potrebbe essere 404, o forse anche 403 se si sta bloccando per motivi di sicurezza. –

+2

Che dire di 402? Quella non è definita in werkzeug ma dovrebbe essere valida. – Pwnna

10

In base alla lettura della domanda a questo potrebbe tornare utile.

C'è un modo più semplice per aggiungere un errore del cliente gestione pagina per una specifica eccezione, si può fare questo:

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 

... quindi innescare il vostro nuovo gestore in caso di necessità con

raise MyCustom404 

Vedere docs here.

4

Nel mio caso, Flask == 0.11.1 Werkzeug == 0.11.10

Io uso interrompere lo stato http codice 451 per esempio.

se si desidera utilizzare abort() con un codice, un numero int, come abort (451), in un primo momento è necessario creare una HTTPException personalizzato, una sottoclasse di HTTPException.and accoda tuo 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) 

poi, quando si accede al percorso nel browser, è possibile guardare questo enter image description here

ma la ragione http frase è sconosciuto,

si può cambiare

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

enter image description here