子应用 - 挂载¶
如果你需要两个独立的 FastAPI 应用,且它们各自拥有独立的 OpenAPI 和文档界面,你可以创建一个主应用,并“挂载”一个(或多个)子应用。
挂载 FastAPI 应用¶
“挂载”意味着在特定路径下添加一个完全“独立”的应用,该应用将负责处理该路径下的所有事务,并使用在该子应用中声明的路径操作。
顶层应用¶
首先,创建主应用(顶层 FastAPI 应用)及其路径操作。
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_main():
return {"message": "Hello World from main app"}
subapi = FastAPI()
@subapi.get("/sub")
def read_sub():
return {"message": "Hello World from sub API"}
app.mount("/subapi", subapi)
子应用¶
然后,创建你的子应用及其路径操作。
这个子应用只是另一个标准的 FastAPI 应用,但它将会被“挂载”。
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_main():
return {"message": "Hello World from main app"}
subapi = FastAPI()
@subapi.get("/sub")
def read_sub():
return {"message": "Hello World from sub API"}
app.mount("/subapi", subapi)
挂载子应用¶
在你的顶层应用 app 中,挂载子应用 subapi。
在本例中,它将被挂载到路径 /subapi。
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_main():
return {"message": "Hello World from main app"}
subapi = FastAPI()
@subapi.get("/sub")
def read_sub():
return {"message": "Hello World from sub API"}
app.mount("/subapi", subapi)
查看自动 API 文档¶
现在,运行 fastapi 命令
$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
然后打开位于 http://127.0.0.1:8000/docs 的文档。
你将看到主应用的自动 API 文档,其中仅包含其自身的路径操作。

接着,打开子应用的文档,地址为 http://127.0.0.1:8000/subapi/docs。
你将看到子应用的自动 API 文档,其中仅包含其自身的路径操作,且全部位于正确的子路径前缀 /subapi 下。

如果你尝试与这两个用户界面中的任何一个进行交互,它们都能正常工作,因为浏览器能够与每个特定的应用或子应用进行通信。
技术细节:root_path¶
当你像上面描述的那样挂载一个子应用时,FastAPI 会使用 ASGI 规范中的一种机制——root_path,来负责传递子应用的挂载路径。
这样,子应用就会知道在文档界面中使用该路径前缀。
子应用本身也可以拥有自己挂载的子应用,且一切都能正常工作,因为 FastAPI 会自动处理所有这些 root_path。
你将在“在代理之后 (Behind a Proxy)”一节中学习更多关于 root_path 以及如何显式使用它的知识。