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

hrs*_*ono 29 python abort flask

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

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

@app.errorhandler(404)
def not_found(error):
    return render_template('404.html'), 404
Run Code Online (Sandbox Code Playgroud)

所以,我尝试创建自定义错误代码

if False:
    abort(777)

@app.errorhandler(777)
def something_is_wrong(error):
    return render_template('777.html'), 777
Run Code Online (Sandbox Code Playgroud)

但它不起作用,Werkzeug调试器说:LookupError:777也不例外

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

if False:
    return '777 error', 777
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以做到:

if False:
    return render_template('777.html')
Run Code Online (Sandbox Code Playgroud)

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

Abe*_*lus 36

可能的HTTP状态代码列表由Internet Assigned Numbers Authority修复,因此您无法添加自定义代码.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()
Run Code Online (Sandbox Code Playgroud)

  • 402怎么样?那个在werkzeug中是未定义的,但它应该是有效的. (4认同)
  • `abort.mappings`似乎不再存在; 请改用:`exceptions.default_exceptions [402] = PaymentRequired` (3认同)

And*_*ett 13

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

raise MyCustom404
Run Code Online (Sandbox Code Playgroud)

请参阅此处文档.


xav*_*kip 7

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

我使用例如中止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)
Run Code Online (Sandbox Code Playgroud)

然后,当您在浏览器中访问路径时,您可以查看此内容 在此输入图像描述

但是http原因短语是UNKNOWN,

你可以改变它

from werkzeug.http import HTTP_STATUS_CODES
HTTP_STATUS_CODES[451] = 'Unavailable For Legal Reasons'  # or even empty
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述