You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型提示,此时如果导入顺序存在问题就会触发未定义报错。

解决方案:

  1. 优先升级Python到3.7及以上版本,当前FastAPI最低支持版本就是3.7,高版本运行稳定性更好
  2. 如果必须使用旧版本,把__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:06:03