使用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:777也不例外
我发现this question说我应该这样做:
if False:
return '777 error', 777
不幸的是,上面的代码产生了白屏,即使是Werkzeug调试器也没出来
我知道我可以做到:
if False:
return render_template('777.html')
但如果我使用abort()
,它会使代码更清晰。有没有办法创建自定义错误代码?
答案 0 :(得分:32)
可能的HTTP状态代码列表由Internet Assigned Numbers Authority修复,因此您无法添加自定义代码。 Werkzeug意识到这一点并试图阻止您向浏览器发送无意义的代码。查看list of status codes以查找与您的错误匹配的错误并使用该错误。
修改:将状态代码添加到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 :(得分:12)
根据对问题的解读,这可能会派上用场。
有一种更简单的方法可以为特定异常添加客户错误页面处理,您可以这样做:
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
请参阅docs here。
答案 2 :(得分:6)
就我而言,Flask == 0.11.1 Werkzeug == 0.11.10
例如,我使用中止http状态代码451。
如果你想使用带有代码的abort(),一个int数,比如abort(451),首先应该创建一个自定义HTTPException,一个HTTPException的子类。并将你的HTTPException追加到default_exceptions
。< / p>
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原因短语是UNKNOWN,
你可以改变它
from werkzeug.http import HTTP_STATUS_CODES
HTTP_STATUS_CODES[451] = 'Unavailable For Legal Reasons' # or even empty
答案 3 :(得分:0)
您还可以使用Flask API及其错误处理系统: