4

我有以下代码 - 它有一个 http 处理程序函数(func1)和一个 RESTful API (func2),它们可以通过 URL/test1/test2. 我有一个异常处理函数(exception_handler),它被修饰app.errorhandler()以确保所有未处理的异常都被 jsonify 处理并作为响应发回。

from flask import Flask, jsonify
from flask.ext.restful import Resource, Api

app = Flask(__name__)
api = Api(app)

@app.errorhandler(Exception)
def exception_handler(e):
  return jsonify(reason=e.message), 500

@app.route("/test1", methods=["GET"])
def func1():
    raise Exception('Exception - test1')

class func2(Resource):
  def get(self):
    raise Exception('Exception - test2')

api.add_resource(func2, '/test2')

if __name__ == "__main__":
    app.run(debug=True)

现在,将未处理的异常转换为带有包含异常消息的 JSON 的 HTTP 响应对于普通的 http 处理程序函数来说可以正常func1工作,即,但对于 RESTful API(使用资源创建)即func2.

以下工作正常,如预期func1

$ curl http://127.0.0.1:5000/test1 -X GET
{
  "reason": "Exception - test1"
}

随着func2我们得到一个{"message": "Internal Server Error", "status": 500}而不是{"reason": "Exception - test2"}

$ curl http://127.0.0.1:5000/test2 -X GET
{
    "message": "Internal Server Error",
    "status": 500
}

所以问题是为什么 RESTful API 中未处理的异常不使用 JSON 转换为app.errorhandler?还是有其他方法可以做到这一点?

4

2 回答 2

4

这是因为Flask-Restfulmonkeypatch default Flask.handle_user_exception,它将具有端点的特定逻辑和其他Flask-Restful端点的默认行为。

于 2013-10-04T19:00:40.670 回答
3

Flask-Restful 有自己的错误处理程序,您看到的 JSON 输出/test2是由扩展本身生成的。

如果您通过 Flask 的handle_exception调用注册新的异常处理程序,则可以覆盖 Flask-Restful 的异常。

于 2013-10-04T18:56:37.033 回答