如何在Flask路由方法外部访问Request请求头
问题原因
你当前代码无法正常获取请求头的核心原因是:在真实请求的处理流程中手动创建了test_request_context测试上下文,该上下文是独立的空白模拟环境,会覆盖当前正在生效的真实请求上下文,因此无法读取到当前用户请求的头信息。
此外,只要在同一个请求的生命周期内,Flask提供的request全局代理默认会自动绑定当前真实请求,无论在多少层嵌套函数中调用都不需要手动开启上下文。
可行解决方案
场景1:在同一个请求的处理流程内调用(你当前的测试场景)
直接删除手动创建上下文的代码即可,直接调用request读取信息:
from flask import Flask, request app = Flask("app") def access_header_for_something(): # 同请求生命周期内无需手动管理上下文,直接读取request即可 print(request.headers.get("Authorization"), request.host, request.path) @app.route('/') def index(): access_header_for_something() return 'hello' if __name__=="__main__": app.run(debug=True)
场景2:需要在请求生命周期之外调用(如异步任务、定时脚本等)
请求上下文会在请求处理完成后自动销毁,无法跨生命周期直接读取,需要主动把需要的请求信息作为参数传递给目标函数:
from flask import Flask, request from celery import Celery app = Flask("app") celery = Celery(app.name, broker='redis://localhost:6379/0') # 异步任务属于请求外场景,需要主动传入请求相关参数 @celery.task def async_access_header(headers: dict, host: str, path: str): print(headers.get("Authorization"), host, path) @app.route('/') def index(): # 调用请求外逻辑前,先把需要的信息从当前request中提取出来,作为参数传递 async_access_header.delay(dict(request.headers), request.host, request.path) return 'hello' if __name__=="__main__": app.run(debug=True)
补充说明
test_request_context仅用于单元测试场景下模拟请求,不要在真实请求的处理逻辑中使用该方法。
内容的提问来源于stack exchange,提问作者Rahul D Shetty
相关产品推荐
相关产品推荐

