FastAPI如何先读取配置再初始化认证类依赖?
解决FastAPI中先加载配置再初始化认证依赖的问题
你的思路完全可行,核心就是推迟认证依赖的初始化时机,确保配置先加载完成,下面针对你的场景给出具体实现方案和验证要点:
可行方案1:全局变量延迟初始化
不要在模块级别直接实例化SingleTenantAzureAuthorizationCodeBearer,而是在配置读取完成后再初始化:
from fastapi import FastAPI, Depends from fastapi_azure_auth import SingleTenantAzureAuthorizationCodeBearer # 先声明全局变量,暂不初始化 azure_scheme = None def init_api(): api = FastAPI() # 第一步:读取配置(从文件/环境变量等) config = load_your_config() # 替换为你的配置读取逻辑 # 第二步:加载配置后初始化认证Scheme global azure_scheme azure_scheme = SingleTenantAzureAuthorizationCodeBearer( tenant_id=config.AZURE_TENANT_ID, client_id=config.AZURE_CLIENT_ID, scopes={"https://your-api-scope/.default": "default"} ) # 第三步:注册启动事件,连接Azure @api.on_event("startup") async def startup_event(): await azure_scheme.openid_config.load_config() # 受保护路由使用已初始化的依赖 @api.get("/protected") async def protected_route(user=Depends(azure_scheme)): return {"user_info": user} return api # 最后创建API实例,确保配置和依赖初始化顺序正确 app = init_api()
可行方案2:依赖工厂函数
如果不想用全局变量,可以用工厂函数确保依赖仅在配置加载后实例化,同时保证单例:
from fastapi import FastAPI, Depends from fastapi_azure_auth import SingleTenantAzureAuthorizationCodeBearer _scheme_instance = None _global_config = None def get_azure_scheme(): global _scheme_instance if not _scheme_instance: # 确保配置已加载 if not _global_config: raise RuntimeError("配置未加载,请先初始化配置") _scheme_instance = SingleTenantAzureAuthorizationCodeBearer( tenant_id=_global_config.AZURE_TENANT_ID, client_id=_global_config.AZURE_CLIENT_ID, scopes={"https://your-api-scope/.default": "default"} ) return _scheme_instance def init_api(): api = FastAPI() # 先加载配置并设置为全局 global _global_config _global_config = load_your_config() # 注册启动事件 @api.on_event("startup") async def startup_event(): scheme = get_azure_scheme() await scheme.openid_config.load_config() # 路由使用工厂函数作为依赖 @api.get("/protected") async def protected_route(user=Depends(get_azure_scheme)): return {"user_info": user} return api app = init_api()
关键验证要点
- 必须保证配置读取逻辑在认证Scheme初始化之前执行,无论用全局变量还是工厂函数,都要避免模块加载阶段的提前初始化。
- 启动事件中的
openid_config.load_config()调用,必须在azure_scheme实例化之后执行,否则会因未初始化报错。 - 路由中的
Depends引用的是已完成配置注入的Scheme实例,彻底解决原代码中依赖评估早于配置加载的问题。
内容的提问来源于stack exchange,提问作者dabljues
相关产品推荐
相关产品推荐

