如何在瓶子蓝图中进行jsonify所有响应

时间:2014-11-26 17:05:10

标签: flask

我正在使用Flask Blueprint模块为我的应用程序创建REST API。由于它是REST API,因此每个响应都需要以JSON编码。目前,我必须确保以jsonfify(my_data)结束每个方法,这有点重复且容易忘记。有没有办法告诉Flask我希望我的蓝图中出现的所有回复都被揭开了?

我尝试过:

@blueprint_object.after_request
def after_req(response):
    return jsonify(response)

但这似乎不起作用,我不知道为什么。如果你想知道,我知道Flask-Restful扩展会做到这一点,但我没有使用扩展,因为它不够灵活,不能满足我的需求。

1 个答案:

答案 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),你可以在实例上直接覆盖这个方法,虽然它有点脏。