【问题标题】:flask errorhandler does not work in gunicorn after introducing flask_restful引入flask_restful后,烧瓶错误处理程序在gunicorn中不起作用
【发布时间】:2016-03-06 08:55:51
【问题描述】:

我正在烧瓶中开发 REST API,并计划在 Gunicorn 中运行它。 在我的应用程序中,烧瓶错误处理程序装饰器处理了用户定义的异常。它在烧瓶内置 Web 服务器和 Gunicorn 中都能正常工作。可以从修饰函数生成响应。引入flask_restful后,内置服务器工作正常,但在Gunicorn中,响应总是{"message": "Internal Server Error"}

这里是源代码: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

访问“http://127.0.0.1:8000/o/123
它回应: {“消息”:“订单 [123] 不存在。”}。 错误处理程序工作正常。

访问“http://127.0.0.1:8000/orders/123
它回应: {“消息”:“内部服务器错误”}。 似乎错误处理程序不起作用。

在flask内置服务器中运行时,不会出现问题。

有人遇到同样的问题吗? 这是 flask_restful 或 Gunicorn 中的错误吗? 如何处理这个问题?

【问题讨论】:

  • 我的环境:Flask (0.10.1)、Flask-RESTful (0.3.4)、gunicorn (19.4.1)
  • 那是因为它不太可能引发 ORderNotExistError。在 500 秒内添加一个错误处理程序,然后查看响应是什么。

标签: python flask gunicorn flask-restful


【解决方案1】:

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

要捕获此错误,您需要覆盖 Werkzeug 的异常,这是 flask-restful 使用的。下面的代码应该修复它:

errors={
    'InternalServerError': {
    'status': 500,
    'message': 'Internal Server Error'
},
}
api = Api(app, errors=errors)

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2021-03-31
    • 2019-01-08
    • 2020-08-30
    相关资源
    最近更新 更多