我正在开发REST API并计划在Gunicorn中运行它。 在我的应用程序中,用户定义的Exception由flask errorhandler装饰器处理。它在烧瓶内置Web服务器和Gunicorn中都能正常工作。可以从装饰功能生成响应。在介绍flask_restful之后,内置服务器工作正常,但在Gunicorn中,响应总是 {&#34;消息&#34;:&#34;内部服务器错误&#34;} 。< / p>
以下是源代码:myapp.py
from flask import Flask, jsonify, make_response
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class OrderNotExistError(Exception):
def __init__(self, order_id):
self.message = 'Order [{order_id}] does not exist.'.format(order_id=order_id)
@app.errorhandler(OrderNotExistError)
def order_not_exist(error):
return make_response(jsonify({'message': error.message}), 404)
class OrderAPI(Resource):
def get(self, order_id):
raise OrderNotExistError(order_id)
api.add_resource(OrderAPI, '/orders/<int:order_id>', endpoint='order')
@app.route("/o/<int:order_id>")
def get_order(order_id):
raise OrderNotExistError(order_id)
if __name__ == '__main__':
app.debug = True
app.run()
在Gunicorn中运行它: gunicorn -w4 -b0.0.0.0:8000 myapp:app
访问&#34; http://127.0.0.1:8000/o/123&#34;
它回应:
{&#34;消息&#34;:&#34;订单[123]不存在。&#34;}。
错误处理程序工作正常。
访问&#34; http://127.0.0.1:8000/orders/123&#34;
它的回应:
{&#34; message&#34;:&#34;内部服务器错误&#34;}。
似乎错误处理程序不起作用。
在flask内置服务器中运行时,问题不会发生。
有人遇到同样的问题吗? 这是flask_restful或Gunicorn中的错误吗? 如何处理这个问题?
答案 0 :(得分:0)
这是因为在应用程序级别有两个级别的错误处理程序,在api级别有一个级别。您正在直接调用api,因此应用程序看不到这一点。 (这解释了为什么通过app.route添加的路由捕获异常,而不是通过api.add_resource添加的路由。)
要捕获此错误,您需要覆盖Werkzeug的例外情况,这是例外情况。以下代码应该修复它:
DEPOSITO 123 1000.00