禁用有关未返回响应的视图函数的Flask警告?

时间:2018-06-10 16:22:09

标签: python flask

我正在使用Flask开发一个API,这个服务不是要呈现任何模板,只是以{"message": "message here", "status_code": 200, "data": {}}"的形式返回json。

我有几个路由,每个路由修改附加到Flask.g的全局响应对象:

from flask import g

from project import app


@app.route('/users/', methods=["GET"])
def get_users():
    ...
    g.res.data["message"] = "Successfully queried users as specified."
    # default g.res.status_code == 200

@app.route('/users/', methods=["POST"])
def post_users():
    ...
    g.res.data["message"] = "Successfully created User."
    g.res.status_code = 201

然后,将响应数据返回给用户由app.after_request

处理
from flask import g, jsonify

from project import app


@app.after_request
def after_request(response: None):
    return jsonify(g.res)

然而,Flask仍然(正确地)认为视图函数没有返回响应,因为技术上视图函数不是,但是after_request处理程序是。

我处理响应数据的方法中是否存在继承问题?我故意切换到使用app.after_request以避免在每个视图函数结束时重复return jsonify(g.res)

如果这种方式没有问题,我应该如何禁用这些警告?

修改:在Flask.app.make_response中引发了错误,其中ValueError的响应为None,并且稍后会尝试进行其他转换(从str到例如Flask.Response个对象。

我可能会直接修改此文件以处理我的特定用例,直到我找到一种惯用的方法来解决这个问题。

1 个答案:

答案 0 :(得分:2)

Flask类进行子类化并覆盖make_response方法。将逻辑从处理程序移动到方法中。如果视图没有返回响应,但g.res中有有效数据,则构建响应并返回,否则请遵循默认行为。

class GResFlask(Flask):
    def make_response(self, rv):
        if not rv and g.res.data:
            return jsonify(g.res)
        return super().make_response(rv)

app = GResFlask(__name__)

重要的是要注意after_request处理程序可以通过扩展添加,而Flask提供的接口意味着它们将期望有效的响应对象。因此,您始终希望从make_response返回有效回复。