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

FastAPI因OAuth2PasswordRequestForm问题无法加载SwaggerUI API文档

FastAPI SwaggerUI无法加载问题解决

问题现象

FastAPI站点运行正常,但SwaggerUI(/docs)无法加载。移除f: OAuth2PasswordRequestForm = Depends()参数后,API文档可正常访问,但该参数是HTML登录表单获取用户输入必需的。

相关代码

后端Python代码

# 渲染登录页面
@router.get('/login',response_class=HTMLResponse)
def login(request : Request):
        return templates.TemplateResponse("login.html", {"request": request})

# 验证用户后生成令牌
@router.post('/login', response_class=HTMLResponse)
def login(request : Request, f: OAuth2PasswordRequestForm = Depends()):
        data = generate(f.username,f.password )
        if data:
            access_token = create_token(data={"sub": f.username})
            return templates.TemplateResponse("authenticated.html", {"request": request, "data" : data, "access_token": access_token, "token_type": "bearer"}) 

前端HTML表单代码

<form method="POST">
    <h5> 访问站点</h5></br>
    <input class="input-box" type="username" placeholder="输入用户名" name="username" required><br><br>  
    <input class="input-box" type="password" placeholder="输入密码" name="password" required><br><br>  
    <button class="login_button"  type="submit">登录</button><br>   
    <br>
</form>  

报错信息

File "/usr/local/lib/python3.9/site-packages/fastapi/openapi/utils.py", line 423, in get_openapi
    definitions = get_model_definitions(
  File "/usr/local/lib/python3.9/site-packages/fastapi/utils.py", line 49, in get_model_definitions
    model_name = model_name_map[model]
KeyError: <class 'pydantic.main.Body_login_login_post'>

解决方法

方案一:排除HTML表单接口出现在API文档中

给POST类型的/login接口添加include_in_schema=False参数,让FastAPI生成OpenAPI文档时跳过该接口,避免模型解析冲突:

修改后的POST接口代码:

@router.post('/login', response_class=HTMLResponse, include_in_schema=False)
def login(request : Request, f: OAuth2PasswordRequestForm = Depends()):
        data = generate(f.username,f.password )
        if data:
            access_token = create_token(data={"sub": f.username})
            return templates.TemplateResponse("authenticated.html", {"request": request, "data" : data, "access_token": access_token, "token_type": "bearer"}) 

原理说明

该报错源于FastAPI在生成OpenAPI schema时,对返回HTMLResponse的POST接口处理OAuth2PasswordRequestForm时,自动创建的Body模型出现命名冲突或无法识别的情况,导致抛出KeyError。通过include_in_schema=False排除该接口后,SwaggerUI不再尝试解析该接口的模型,即可正常加载。

方案二:分离HTML表单接口与API登录接口

将HTML表单提交的接口(如/login)和供API调用的登录接口(如/api/login)分开实现,API文档仅处理/api/login接口,避免两种场景的冲突。此方案适合需要同时提供HTML登录和API登录的场景。


内容的提问来源于stack exchange,提问作者Menor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:40:40