Flask - 如何创建自定义的abort()代码?

35

使用abort()或当真正出现错误时,Flask具有良好的错误处理程序。

从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(),代码会更加清晰。有没有办法创建自定义错误码?


如果您正在使用Flask 1.0,似乎方法已经改变,您可以引发和捕获自定义异常:http://flask.pocoo.org/docs/1.0/patterns/apierrors/ - Tom Saleeba
4个回答

51

可能的HTTP状态码列表由互联网分配号码管理局确定,因此您无法添加自定义状态码。 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()

1
可能取决于您拒绝输入的原因。另一个适当/常见的代码可能是404,或者甚至是403,如果您出于安全原因进行阻止。 - Thomas Orozco
4
402是什么情况?在Werkzeug中它未被定义,但应该是一个有效的状态码。 - Pwnna
实际上这正是我想要表达的。我想说:此服务需要付款。 - Pwnna
7
abort.mappings no longer seems to exist; use this instead: exceptions.default_exceptions[402] = PaymentRequired - claymation
1
在我的情况下(Flask==0.11.1,Werkzeug==0.11.10),它会中止。映射[402] = PaymentRequired,而不是“mappings”。 - Stan Zeez
显示剩余6条评论

18

根据问题的阅读方式,这可能会有所帮助。

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

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

请查看此处的文档


10
在我的情况下,Flask==0.11.1 Werkzeug==0.11.10。
例如,我使用http状态码451来中止。
如果您想使用abort()与一个代码,即一个整数,如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)

当你在浏览器中访问路径时,你可以看到这个 enter image description here

但是HTTP响应短语是未知的,

你可以更改它。

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

enter image description here


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接