RESTful API中未处理的异常没有得到jsonify

时间:2013-10-04 17:11:12

标签: python rest exception resources flask

我有以下代码 - 它有一个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?或者还有其他方法吗?

2 个答案:

答案 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的异常。