FastAPI实例化自定义OAuth2类报NameError: name 'Request'未定义求助
问题原因及解决方案
你遇到的NameError: name 'Request' is not defined报错,排除拼写错误后,通常是以下两种原因导致,对应解决方案如下:
原因1:实例化/依赖注入时的作用域未导入Request
你当前的导入语句from starlette.requests import Request仅在当前自定义OAuth2类的文件中生效,如果你在其他文件中实例化OAuth2PasswordBearerCookie类,或是在路径操作函数中把这个类的实例作为依赖注入时,引用了Request类型但没有对应导入,就会触发该报错。
解决方案:在所有用到
Request类型做类型提示的文件顶部,都加上导入语句:from starlette.requests import Request # 或是FastAPI封装好的导入,和上面效果等价 from fastapi import Request
原因2:Python版本低于3.7,from __future__ import annotations未生效
你添加的from __future__ import annotations作用是让类型提示在运行时不做求值,避免循环导入问题,但如果你运行代码的Python版本低于3.7,该未来特性不被支持,运行时会尝试解析__call__方法的request: Request类型提示,此时如果导入顺序存在问题就会触发未定义报错。
解决方案:
- 优先升级Python到3.7及以上版本,当前FastAPI最低支持版本就是3.7,高版本运行稳定性更好
- 如果必须使用旧版本,把
__call__方法的类型提示改成字符串形式即可:async def __call__(self, request: "Request") -> Optional[str]:
额外代码修复
你贴出的代码中还遗漏了HTTPException的导入,运行时也会触发同类报错,需要在导入部分补充一行:
from fastapi import status, HTTPException
验证方法
修改完成后,按照以下方式调用即可正常使用:
from fastapi import FastAPI, Depends app = FastAPI() oauth2_scheme = OAuth2PasswordBearerCookie(tokenUrl="token") @app.get("/test") async def test(token: str = Depends(oauth2_scheme)): return {"token": token}
内容的提问来源于stack exchange,提问作者gideon_mandu
相关产品推荐
相关产品推荐

