我正在使用Flask Blueprint模块为我的应用程序创建REST API。由于它是REST API,因此每个响应都需要以JSON编码。目前,我必须确保以jsonfify(my_data)
结束每个方法,这有点重复且容易忘记。有没有办法告诉Flask我希望我的蓝图中出现的所有回复都被揭开了?
我尝试过:
@blueprint_object.after_request
def after_req(response):
return jsonify(response)
但这似乎不起作用,我不知道为什么。如果你想知道,我知道Flask-Restful扩展会做到这一点,但我没有使用扩展,因为它不够灵活,不能满足我的需求。
答案 0 :(得分:2)
我写了一个小代码片段,将json_route
方法添加到已存在的蓝图(Blueprint
类的实例)中。你可以调用它而不是a_blueprint.route
来装饰一个返回json兼容内容的视图:
import types
from flask import jsonify
def json_route(self, rule, **options):
def decorator(f):
endpoint = options.pop("endpoint", f.__name__)
def new_f(*args, **kwargs):
return jsonify(f(*args, **kwargs))
self.add_url_rule(rule, endpoint, new_f, **options)
return new_f
return decorator
a_blueprint.json_route = types.MethodType(json_route, a_blueprint)
然后您可以这样声明您的观点:
@a_blueprint.json_route('/test')
def test_dict():
return {'foo': 'bar'}
如果你想在多个蓝图中使用这个装饰器,那么可能值得将Flask的Blueprint类子类化为在那里添加方法。
如果你不想使用不同的装饰器(json_route
而不是route
),你可以在实例上直接覆盖这个方法,虽然它有点脏。