有没有一种方法可以添加一个全局包罗万象的错误处理程序,可以在其中将响应更改为通用JSON响应?
我无法使用该got_request_exception
信号,因为它不允许修改响应(http://flask.pocoo.org/docs/0.10/signals/)。
相反,所有信号处理程序均以未定义的顺序执行,并且不修改任何数据。
我宁愿不要包装该app.handle_exception
函数,因为感觉就像是内部API。我想我正在寻找类似的东西:
@app.errorhandler()
def handle_global_error(e):
return "Global error"
请注意,errorhandler
不会接受任何参数,这意味着它将捕获所有未附加特定错误处理程序的异常/状态代码。我知道我可以使用errorhandler(500)
或errorhandler(Exception)
捕获异常,但是abort(409)
例如,如果这样做,它将仍然返回HTML响应。
您可以使用@app.errorhandler(Exception)
:
演示(HTTPException检查可确保保留状态码):
from flask import Flask, abort, jsonify
from werkzeug.exceptions import HTTPException
app = Flask('test')
@app.errorhandler(Exception)
def handle_error(e):
code = 500
if isinstance(e, HTTPException):
code = e.code
return jsonify(error=str(e)), code
@app.route('/')
def index():
abort(409)
app.run(port=1234)
输出:
$ http get http://127.0.0.1:1234/
HTTP/1.0 409 CONFLICT
Content-Length: 31
Content-Type: application/json
Date: Sun, 29 Mar 2015 17:06:54 GMT
Server: Werkzeug/0.10.1 Python/3.4.3
{
"error": "409: Conflict"
}
$ http get http://127.0.0.1:1234/notfound
HTTP/1.0 404 NOT FOUND
Content-Length: 32
Content-Type: application/json
Date: Sun, 29 Mar 2015 17:06:58 GMT
Server: Werkzeug/0.10.1 Python/3.4.3
{
"error": "404: Not Found"
}
如果您还想覆盖Flask的默认HTML异常(以便它们也返回JSON),请在以下代码之前添加以下内容app.run
:
from werkzeug.exceptions import default_exceptions
for ex in default_exceptions:
app.register_error_handler(ex, handle_error)
对于较旧的Flask版本(<= 0.10.1,即当前的任何非git / master版本),将以下代码添加到您的应用程序中以显式注册HTTP错误:
from werkzeug import HTTP_STATUS_CODES
for code in HTTP_STATUS_CODES:
app.register_error_handler(code, handle_error)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句