在Flask请求中更改标头的最佳做法是什么?

问题描述 投票:0回答:1

我有一个Flask应用,该应用使用自定义装饰器来验证在HTTP标头属性中传递的AWS Cognito登录令牌。该过程包括刷新令牌(这超出了此问题的范围)。获得刷新的令牌后,我想更新header属性以包括刷新的令牌并退出。由于Flask / Werkzeug request.headers属性是不可变的,因此我无法通过常规方式对其进行更新。

如何在此装饰器的上下文中更新标题?有我没有想到的更好的方法吗?

这里有一些示例代码演示了这个问题:

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        token = request.headers.get('X-MyApp-Auth')
        if not token:
            return redirect(url_for('login', next=request.url))
        # Test for expired token (pseudocode)
        if expired(token):
            # Refresh the token (pseudocode)
            new_token = refresh(refresh_token)
            # This is the part where the immutability gets me stuck
            request.headers.set('X-MyApp-Auth', new_token)
        return f(*args, **kwargs)
    return decorated_function
http flask http-headers werkzeug
1个回答
0
投票

此示例将Flask应用程序包装在定制的WSGI中间件中,该中间件在Flask请求处理之前修改了WSGI环境:

from flask import Flask, request, jsonify


class InterceptRequestMiddleware:
    def __init__(self, wsgi_app):
        self.wsgi_app = wsgi_app

    def __call__(self, environ, start_response):
        environ['HTTP_USER_AGENT'] = 'foobar'
        return self.wsgi_app(environ, start_response)


app = Flask(__name__)
app.wsgi_app = InterceptRequestMiddleware(app.wsgi_app)


@app.route('/')
def index():
    return jsonify({'headers': {k: v for k, v in request.headers}})


if __name__ == '__main__':
    app.run(debug=True)

链接:

http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.html

© www.soinside.com 2019 - 2024. All rights reserved.