Flask添加参数以查看before_request中的方法

时间:2013-08-18 06:24:34

标签: python flask

假设我在/ api /某个地方有一个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

这可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:10)

执行此操作的一种方法是使用flask.g。来自the docs

  

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

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

flask.g一样,

flask.request就是Flask和Werkzeug所谓的"context local"对象 - 粗略地说,这个对象假装是全局的,但实际上会为每个请求公开不同的值。 / p>

答案 1 :(得分:0)

这可以使用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

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