我有以下代码 - 它有一个http处理函数(func1)
和一个RESTful API (func2)
,可以通过网址/test1
和/test2
访问它们。我有一个异常处理函数(exception_handler)
,它由app.errorhandler()
修饰,以确保所有未处理的异常都是jsonify'ed并作为响应发回。
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(使用Resource创建)也是如此,即{{ 1}}。
以下使用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"}
所以问题是为什么RESTful API中未处理的异常没有使用$ curl http://127.0.0.1:5000/test2 -X GET
{
"message": "Internal Server Error",
"status": 500
}
转换为JSON?或者还有其他方法吗?
答案 0 :(得分:4)
这是因为Flask-Restful
monkeypatch默认Flask.handle_user_exception
具有specific logic for Flask-Restful
endpoints和其他端点的默认行为。
答案 1 :(得分:3)
Flask-Restful有自己的错误处理程序,你从/test2
看到的JSON输出是由扩展本身生成的。
如果您通过Flask的handle_exception调用注册新的异常处理程序,则可以覆盖Flask-Restful的异常。