介绍
app.mount() 是 FastAPI 用于挂载独立 ASGI 应用的方法,可将另一个完整应用(FastAPI/Starlette/StaticFiles)绑定到主应用的指定路径下,该路径下的所有请求由被挂载应用独立处理。
语法
def mount(
self,
path: str,
app: ASGIApp,
name: Optional[str] = None
) -> None:
- path:挂载路径(如
/api/v2),主应用中该前缀请求转发给子应用。 - app:被挂载的 ASGI 应用实例(FastAPI、Starlette、StaticFiles 等)。
- name:可选,挂载点标识名,用于内部路由管理。
与 APIRouter 区别
| 特性 | app.mount() |
APIRouter(app.include_router) |
|---|---|---|
| 应用独立性 | 完全独立:独立生命周期、中间件、文档、OpenAPI | 共享主应用:共用生命周期、中间件、文档、OpenAPI |
| 路由隔离 | 挂载路径下完全接管,主应用不干涉 | 主应用与路由合并,共享命名空间 |
| 适用场景 | 多版本API、微服务聚合、静态文件服务 | 模块化路由、单应用内功能拆分 |
| 文档地址 | 子应用独立文档:/mount-path/docs |
统一文档:/docs |
使用场景与代码示例
场景1:挂载静态文件
FastAPI 内置 StaticFiles 用于托管静态资源(HTML/CSS/JS/图片)。
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
app = FastAPI()
# 挂载静态目录到 /static
app.mount(
"/static",
StaticFiles(directory="static"), # 本地 static 目录
name="static"
)
访问:http://localhost:8000/static/logo.png → 读取 static/logo.png
场景2:挂载 FastAPI 子应用(多版本API)
from fastapi import FastAPI
# 主应用
app = FastAPI(title="主应用")
# 子应用 v1
app_v1 = FastAPI(title="API v1")
@app_v1.get("/users")
def get_users_v1():
return {"version": "v1", "users": ["Alice"]}
# 子应用 v2
app_v2 = FastAPI(title="API v2")
@app_v2.get("/users")
def get_users_v2():
return {"version": "v2", "users": ["Bob", "Charlie"]}
# 挂载子应用
app.mount("/api/v1", app_v1)
app.mount("/api/v2", app_v2)
# 主应用路由
@app.get("/")
def root():
return {"message": "主应用根路径"}
- 请求示例:
GET /→ 主应用响应GET /api/v1/users→ 子应用 v1 响应GET /api/v2/users→ 子应用 v2 响应
- 独立文档:
- 主应用:
http://localhost:8000/docs - v1 文档:
http://localhost:8000/api/v1/docs - v2 文档:
http://localhost:8000/api/v2/docs
- 主应用:
路径匹配规则
- 前缀匹配:
/api/v1挂载后,/api/v1、/api/v1/xxx均由子应用处理。 - 无重叠优先级:主应用路由与挂载路径冲突时,挂载路径优先。
生命周期与中间件隔离
- 独立 Lifespan:子应用可定义独立
lifespan,与主应用生命周期互不干扰。 - 中间件隔离:主应用中间件不作用于子应用,子应用需单独注册中间件。
OpenAPI 与文档
- 每个挂载的 FastAPI 子应用拥有独立 OpenAPI schema 和文档页面。
- 子应用文档路径:
/mount-path/docs,Redoc:/mount-path/redoc。
root_path 自动处理
FastAPI 自动通过 ASGI root_path 传递挂载路径给子应用,子应用内部路由无需感知挂载前缀。
例如:子应用 /users → 实际访问 /api/v1/users。
常见问题
- ❌ 混淆
mount与include_router:mount是应用级挂载,include_router是路由级合并,不可混用。 - ❌ 共享状态风险:主应用与子应用
state隔离,需通过外部存储(Redis/数据库)共享数据。 - ⚠️ 挂载路径不可为空:
path必须以/开头,不可为/(主应用根路径)。 - ⚠️ 子应用必须是 ASGI 应用:仅支持 ASGI 协议应用,不支持 WSGI 应用(如 Flask 需适配)。
总结
app.mount() 是 FastAPI 实现应用级模块化的核心工具,核心价值在于完全隔离的独立应用挂载,适合多版本API、静态文件托管、第三方ASGI应用集成等场景。与 APIRouter 配合使用,可兼顾模块化拆分与应用级隔离,构建清晰的大型FastAPI项目架构。