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

ZEC*_*nmo 3 python flask flask-login

我正在为我的 Flask 服务器设置一个令牌身份验证系统,并且我希望能够设置一个装饰器,如下所示:

@app.route('/my/data/')
@requires_token_auth
def get_my_endpoint_data():
    """Return JSON data""""
    return get_data()
Run Code Online (Sandbox Code Playgroud)

然后我将到达 /my/data?token=myawesometokenvalue 等端点

我已经将装饰器功能设置为

def requires_token_auth(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        ... do stuff ...
        return f(*args, **kwargs)
return wrapped
Run Code Online (Sandbox Code Playgroud)

不幸的是,“token”参数在 args 内部不可用。问题似乎是 Flask 传递了 req.view_args,而不是 req.args。

*来自flask的app.py *

1344         return self.view_functions[rule.endpoint](**req.view_args)
Run Code Online (Sandbox Code Playgroud)

如何从包装函数内部访问查询参数?

bog*_*ata 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
    })
Run Code Online (Sandbox Code Playgroud)