我正在使用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
个对象。
我可能会直接修改此文件以处理我的特定用例,直到我找到一种惯用的方法来解决这个问题。
答案 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
返回有效回复。