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?
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()
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.
You could also use Flask API and its error handling system:
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
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
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?
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()
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.
You could also use Flask API and its error handling system:
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
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