在引入flask_restful之后,flask errorhandler在gunicorn中不起作用

时间:2015-12-02 07:42:21

标签: python flask gunicorn flask-restful

我正在开发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中的错误吗? 如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

这是因为在应用程序级别有两个级别的错误处理程序,在api级别有一个级别。您正在直接调用api,因此应用程序看不到这一点。 (这解释了为什么通过app.route添加的路由捕获异常,而不是通过api.add_resource添加的路由。)

要捕获此错误,您需要覆盖Werkzeug的例外情况,这是例外情况。以下代码应该修复它:

DEPOSITO 123 1000.00