如何修改FastAPI include_router描述及fastapi-users默认路由行为?
无需修改fastapi-users源码,修改标准路由行为的方案
当然可以在不修改插件源码的前提下,修改fastapi-users生成的标准路由行为,以下是两种可行的实现方式:
方法一:提前修改路由对象属性
先获取fastapi-users生成的路由实例,遍历其内部的路由项,直接修改对应属性(比如description、tags、依赖项等),再将修改后的路由包含到你的APIRouter中。
示例代码:
from fastapi import Depends from sqlalchemy import select from fastapi import APIRouter, FastAPI from app.schemas.schemas import UserRead from app.routes.permissions import admin_route from sqlalchemy.ext.asyncio import AsyncSession from app.schemas.schemas import UserCreate, UserUpdate from app.models.users import auth_backend, fastapi_users from app.databases.user import User, get_async_session test = APIRouter() # 获取fastapi-users生成的用户路由实例 users_router = fastapi_users.get_users_router(UserRead, UserUpdate) # 遍历路由项,针对性修改属性 for route in users_router.routes: # 根据路由路径匹配修改描述 if route.path.endswith("/me"): route.description = "获取当前登录用户的详细信息" elif route.path.endswith("/{id}"): route.description = "根据用户ID查询指定用户的信息" # 统一添加标签前缀(可选) route.tags = ["user-management"] # 给所有用户路由添加权限依赖(可选) route.dependencies.append(Depends(admin_route)) # 将修改后的路由包含到自定义APIRouter中 test.include_router( users_router, prefix="/users", tags=["stuff"], ) @test.get("/users", response_model=list[UserRead], tags=["stuff"], description="获取系统所有用户列表") async def get_all_users(session: AsyncSession = Depends(get_async_session)): statement = select(User) result = await session.execute(statement) return result.scalars().all() app = FastAPI() app.include_router(test)
方法二:通过启动事件批量修改
利用FastAPI的startup事件钩子,在应用启动完成后遍历所有路由,筛选出fastapi-users生成的路由并修改其属性。
示例代码:
from fastapi import FastAPI, Depends from app.models.users import fastapi_users from app.schemas.schemas import UserRead, UserUpdate from app.routes.permissions import admin_route test = APIRouter() users_router = fastapi_users.get_users_router(UserRead, UserUpdate) test.include_router(users_router, prefix="/users", tags=["stuff"]) app = FastAPI() app.include_router(test) @app.on_event("startup") def adjust_users_routes(): # 遍历所有已注册的路由 for route in app.routes: # 筛选fastapi-users生成的路由(可通过路径前缀或路由名称判断) if route.path.startswith("/users") and "users_" in route.name: # 修改描述 route.description = f"用户管理接口:{route.description or '无描述'}" # 添加权限校验依赖 route.dependencies.append(Depends(admin_route))
原理说明
fastapi-users生成的APIRouter和FastAPI原生的路由实例结构完全一致,其内部的routes列表包含了所有具体的路由项(Route对象)。每个Route对象公开了description、tags、dependencies、response_model等可修改的属性,直接调整这些属性就能实现对路由行为的自定义,无需触碰插件源码。
内容的提问来源于stack exchange,提问作者Ano Nymous
相关产品推荐
相关产品推荐

