http - 在 Flask 请求中更改标头的最佳做法是什么?
问题描述
我有一个 Flask 应用程序,它使用自定义装饰器来验证在 HTTP 标头属性中传递的 AWS Cognito 登录令牌。该过程包括刷新令牌(这超出了本问题的范围)。获得刷新的令牌后,我想更新标头属性以包含刷新的令牌并退出。由于 Flask/Werkzeugrequest.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
解决方案
此示例将 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)
链接:
推荐阅读
- c# - .net 核心控制器 - 是否将 [FromBody] 属性添加到方法?
- firebase - 编译后 Unity with Firebase 冻结 (AssetDatabase.Refresh)
- python - 只有大小为 1 的数组可以转换为 Python 标量图形 sin
- qt - QScrollEvent 和 QWheelEvent 有什么区别?
- python - 如何在连接到 Raspberry Pi 的显示器上显示 GUI?
- python - 使用 Turtle Not PyGame 的 Python 游戏:错误消息
- excel - 如何将包含变量的字符串写入VBA中的特定单元格?
- instagram - instagram.com/{USER_NAME}/?__a=1 在没有身份验证的情况下不再工作?
- airflow - 找不到放置在 Airflow 中的本地文件 - GCSToLocalFilesystemOperator
- php - 未指定应用程序加密密钥。拉拉维尔