子应用程序 - 挂载¶
如果你需要两个独立的 FastAPI 应用程序,拥有各自独立的 OpenAPI 和文档 UI,你可以有一个主应用程序,然后“挂载”一个(或多个)子应用程序。
挂载一个 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 main.py
<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 的机制来负责传递子应用程序的挂载路径。
这样,子应用程序就会知道为文档 UI 使用该路径前缀。
并且子应用程序也可以拥有自己的挂载子应用程序,所有这些都会正常工作,因为 FastAPI 会自动处理所有这些 root_path。
你将在关于 代理后面 的部分了解更多关于 root_path 的信息以及如何显式使用它。