Flask – How to create custom abort() code?

Question:

Flask has a good error handler by using abort() or when the error truly occurred.

From Flask documentation there is an example for error 404 handler:

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

So, I tried to create custom error code like

if False:
    abort(777)

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

But it does not work and the Werkzeug debugger says: LookupError: no exception for 777

I found this question which says I should do it like this:

if False:
    return '777 error', 777

Unfortunately, the code above produce white-screen, even the Werkzeug debugger does not come out

I know I can simply do:

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

But it will make the code cleaner if I use the abort(). Is there any way to create custom error code?

Asked By: hrsetyono

||

Answers:

The list of possible HTTP status codes is fixed by the Internet Assigned Numbers Authority, so you cannot add a custom one. Werkzeug recognizes this and tries to stop you sending a meaningless code to the browser. Look through the list of status codes to find one that matches your error and use that one.

Edit: Adding status codes to 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()
Answered By: Abe Karplus

Depending on the reading of the question this might come in handy.

There is an easier way to add customer error page handling for a specific exception, you can do this:

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

…then trigger your new handler when you need it with

raise MyCustom404

See the docs here.

Answered By: Andrew Barrett

You could also use Flask API and its error handling system:

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

Answered By: Mathieu Rodic

In my case, Flask==0.11.1 Werkzeug==0.11.10

I use abort the http status code 451 for example.

if you want use abort() with a code,a int number,like abort(451), at first you should create a custom HTTPException, a subclass of HTTPException.and append your HTTPException to 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)

then when you access the path in browser, you can look this
enter image description here

but the http reason phrase is UNKNOWN,

you can change it

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

enter image description here

Answered By: xavierskip
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.