34

Flask 通过使用abort()或当错误真正发生时有一个很好的错误处理程序。

从 Flask 文档中有一个错误 404 处理程序的示例:

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

因此,我尝试创建自定义错误代码,例如

if False:
    abort(777)

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

但它不起作用,Werkzeug 调试器说: LookupError: no exception for 777

我发现这个问题说我应该这样做:

if False:
    return '777 error', 777

不幸的是,上面的代码产生了白屏,甚至 Werkzeug 调试器也没有出来

我知道我可以简单地做:

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

但如果我使用abort(). 有没有办法创建自定义错误代码?

4

4 回答 4

46

可能的 HTTP 状态代码列表由 Internet 号码分配机构修复,因此您无法添加自定义状态代码。Werkzeug 认识到这一点并试图阻止您向浏览器发送无意义的代码。查看状态代码列表以找到与您的错误匹配的代码并使用该代码。

编辑:向 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()
于 2012-09-05T16:40:31.460 回答
15

根据对问题的阅读,这可能会派上用场。

有一种更简单的方法可以为特定异常添加客户错误页面处理,您可以这样做:

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

...然后在您需要时触发您的新处理程序

raise MyCustom404

请参阅此处的文档

于 2013-11-11T10:37:48.017 回答
9

就我而言,Flask==0.11.1 Werkzeug==0.11.10

例如,我使用 abort http 状态代码 451。

如果你想使用 abort() 和一个代码,一个 int 数字,比如 abort(451),首先你应该创建一个自定义 HTTPException,一个 HTTPException 的子类。然后将你的 HTTPException 附加到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)

然后当你在浏览器中访问路径时,你可以看看这个 在此处输入图像描述

但是http原因短语是未知的,

你可以改变它

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

在此处输入图像描述

于 2016-07-29T00:10:27.850 回答
0

您还可以使用Flask API及其错误处理系统:

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

于 2014-11-21T07:13:45.270 回答