【发布时间】:2019-09-26 16:52:41
【问题描述】:
我正在尝试使用“Implementing API Exceptions”页面上的指南在 Flask 1.0.2 和 Flask-RESTful 0.3.7 中创建自定义错误处理程序。 (Flask-RESTful 有自己的creating custom error messages 方式,但由于它似乎没有办法在异常时接受自定义错误消息,所以我尝试使用 vanilla Flask 方法。)
from flask import Flask, jsonify
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
#########################################
class MyGenericException(Exception):
status_code = 500
def __init__(self, message, status_code=None, payload=None):
Exception.__init__(self)
self.message = message
if status_code is not None:
self.status_code = status_code
self.payload = payload
def to_dict(self):
rv = dict(self.payload or ())
rv['message'] = self.message
return rv
@app.errorhandler(MyGenericException)
def handle_generic_error(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
#########################################
class TestMe(Resource):
def get(self):
raise MyGenericException('A generic error', status_code=501)
api.add_resource(TestMe, '/testme', endpoint='TestMe')
#########################################
if __name__ == '__main__':
app.run(debug=False)
调用http://127.0.0.1:5000/testme 只会返回一个通用的“500 内部服务器错误”消息,但不会返回带有我的自定义错误文本的 501 错误。似乎MyGenericException 被正确提升,但 Flask 似乎忽略了它。
[2019-05-08 17:09:18,409] ERROR in app: Exception on /testme [GET]
Traceback (most recent call last):
File "C:\Users\testuser\Envs\testenv\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\testuser\Envs\testenv\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\testuser\Envs\testenv\lib\site-packages\flask_restful\__init__.py", line 458, in wrapper
resp = resource(*args, **kwargs)
File "C:\Users\testuser\Envs\testenv\lib\site-packages\flask\views.py", line 88, in view
return self.dispatch_request(*args, **kwargs)
File "C:\Users\testuser\Envs\testenv\lib\site-packages\flask_restful\__init__.py", line 573, in dispatch_request
resp = meth(*args, **kwargs)
File "C:/Users/testuser/Documents/PyCharm Projects/TestApp/testapp.py", line 32, in get
raise MyGenericException('A generic error', status_code=505)
MyGenericException
@app.errorhandler 装饰器似乎已为自定义 MyGenericException 异常正确设置。为什么 Flask 不处理它?
感谢任何可以提供帮助的人。
【问题讨论】:
-
@dylanj.nz,不,这是对 Flask-RESTful 解决方案的讨论,我试图避免使用纯 Flask 错误处理程序。
-
我从该问题和文档中获取的关键信息是,如果您的路线是 Flask-RESTful 路线,您的路线将由
handle_error()处理,这是唯一的方法防止或自定义这是实现您自己的 API 类,并覆盖handle_error()。 -
嗯。我将docs 解释为意味着 Flask-RESTful 会拦截 400 和 500 错误,但不会(例如)我试图在上面的异常中引发的 505 错误。但也许它的拦截比我想象的要多——我想我得尝试一下。
-
好吧,呸。看起来 Flask-RESTful 确实在拦截 all 5xx 错误,即使没有定义自定义处理程序。真可惜。 @dylanj.nz,如果您想将您的评论放入答案中,我会接受。
标签: python exception flask error-handling flask-restful