有没有一种方法可以添加一个全局包罗万象的错误处理程序,可以在其中将响应更改为通用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版本(
from werkzeug import HTTP_STATUS_CODES
for code in HTTP_STATUS_CODES:
    app.register_error_handler(code, handle_error)

关于python - 全局错误处理程序的任何异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29332056/

10-12 14:24
查看更多