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

FastAPI中Swagger UI实现多账户授权的方法咨询

解决FastAPI中多OAuth2账户的Swagger UI支持问题

问题根源

你之前创建两个独立FastAPI实例的方式无效,是因为ASGI服务器(比如Uvicorn)只会启动你指定的单个实例,未被指定的实例不会对外提供服务。正确的做法是将两个路由作为子应用挂载到同一个主FastAPI实例下,各自保留独立的Swagger文档入口。

实现步骤

1. 保留原有路由定义

你的user_route.py和shop_route.py无需修改,确保各自的OAuth2PasswordBearer指向正确的登录接口:

# user_route.py
from fastapi import APIRouter, OAuth2PasswordBearer, Depends

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/user/login")
router = APIRouter(prefix="/api/user")

# 示例登录接口
@router.post("/login")
async def user_login():
    return {"access_token": "user_token", "token_type": "bearer"}

# 示例需授权接口
@router.get("/profile")
async def user_profile(token: str = Depends(oauth2_scheme)):
    return {"user_id": 1, "username": "test_user"}
# shop_route.py
from fastapi import APIRouter, OAuth2PasswordBearer, Depends

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/shop/login")
router = APIRouter(prefix="/api/shop")

# 示例登录接口
@router.post("/login")
async def shop_login():
    return {"access_token": "shop_token", "token_type": "bearer"}

# 示例需授权接口
@router.get("/dashboard")
async def shop_dashboard(token: str = Depends(oauth2_scheme)):
    return {"shop_id": 100, "name": "test_shop"}

2. 主应用挂载子应用

在main.py中创建一个主FastAPI实例,然后分别将用户和商家的路由包装为独立的子应用,挂载到主应用下并指定各自的文档路径:

from fastapi import FastAPI
from user_route import router as user_router
from shop_route import router as shop_router

# 创建主应用
app = FastAPI(title="Multi-Auth API")

# 创建用户子应用,配置独立Swagger文档地址
user_app = FastAPI(title="User Account API", docs_url="/docs-user")
user_app.include_router(user_router)

# 创建商家子应用,配置独立Swagger文档地址
shop_app = FastAPI(title="Shop Account API", docs_url="/docs-shop")
shop_app.include_router(shop_router)

# 将两个子应用挂载到主应用根路径
app.mount("/", user_app)
app.mount("/", shop_app)

3. 启动服务

用Uvicorn启动主应用即可:

uvicorn main:app --reload

访问方式

  • 用户端Swagger文档:http://localhost:8000/docs-user,使用用户账户登录后可调用/api/user/下的所有接口
  • 商家端Swagger文档:http://localhost:8000/docs-shop,使用商家账户登录后可调用/api/shop/下的所有接口

补充说明

  • 两个子应用的docs_url不能重复,否则会被覆盖;挂载路径都设为/不影响功能,因为各自的路由前缀已经做了区分
  • 如果需要更清晰的路径隔离,也可以将子应用挂载到不同路径,比如app.mount("/user", user_app),此时用户文档地址会变为http://localhost:8000/user/docs-user,可按需调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:36:09