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
相关产品推荐
相关产品推荐

