将查询参数传递给Flask装饰器

3 投票
2 回答
3703 浏览
提问于 2025-04-28 11:13

我正在为我的Flask服务器设置一个令牌认证系统,我想创建一个装饰器,效果大概是这样的:

@app.route('/my/data/')
@requires_token_auth
def get_my_endpoint_data():
    """Return JSON data""""
    return get_data()

然后我会访问像这样的接口:/my/data?token=myawesometokenvalue

我已经设置了我的装饰器函数,像这样:

def requires_token_auth(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        ... do stuff ...
        return f(*args, **kwargs)
return wrapped

但是,'token'这个参数在args里面无法使用。问题似乎是Flask通过req.view_args传递参数,而不是req.args。

* 来自flask的app.py *

1344         return self.view_functions[rule.endpoint](**req.view_args)

我该如何在被装饰的函数内部访问查询参数呢?

暂无标签

2 个回答

2

哦,我刚刚意识到我可以像平常一样来做这件事!

token = request.args.get('token')
5

因为这是“flask 查询参数 装饰器”的第一个谷歌搜索结果,所以我最终找到的解决方案是,在方法中添加查询参数,除了路径参数之外:

def query_params(f):
    """
    Decorator that will read the query parameters for the request.
    The names are the names that are mapped in the function.
    """
    parameter_names = inspect.getargspec(f).args

    @wraps(f)
    def logic(*args, **kw):
        params = dict(kw)

        for parameter_name in parameter_names:
            if parameter_name in request.args:
                params[parameter_name] = request.args.get(parameter_name)

        return f(**params)

    return logic

@app.route('/hello/<uid>', methods=['GET', 'POST'])
@query_params
def hello_world(uid, name):
    return jsonify({
        'uid': uid,
        'name': name
    })

撰写回答