10

假设我在 /api/something 有一个 API。API 需要定义 api_key,它会查看请求参数和 cookie。如果它找到 api_key,我希望它把 api_key 传递给路由方法,在这种情况下something

@app.before_request
def pass_api_key():
    api_key = request.args.get('api_key', None)
    if api_key is None:
        api_key = request.cookies.get('api_key', None)
    if api_key is None:
        return 'api_key is required'
    # add parameter of api_key to something method

@app.route('/api/something')
def something(api_key):
    return api_key

这可能吗?

提前致谢。

4

2 回答 2

15

一种方法是使用flask.g. 从文档

要仅从一个函数到另一个函数共享对一个请求有效的数据,全局变量还不够好,因为它会在线程环境中中断。Flask 为您提供了一个特殊的对象,确保它仅对活动请求有效,并且将为每个请求返回不同的值。

设置g.api_key为您要存储的值before_request并在路由方法中将其读出。

flask.g, 就像flask.requestFlask 和 Werkzeug 所说的“上下文本地”对象 - 粗略地说,一个假装是全局的对象,但实际上向每个请求公开了不同的值。

于 2013-08-18T07:07:20.530 回答
1

这可以使用url_value_processor装饰器完成:

@app.url_value_preprocessor
def get_project_object(endpoint, values):
    api_key = values.get('api_key')
    if api_key is None:
        api_key = request.cookies.get('api_key', None)
    if api_key is None:
        raise Exception('api_key is required')
    values['api_key'] = api_key

这也可以在蓝图基础上完成,因此它仅适用于指定蓝图中的视图。

于 2017-07-09T13:11:54.907 回答