Search code examples
pythonflaskabort

Flask - How to create custom abort() code?


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?


Solution

  • 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()