Skip to content

子应用 - 挂载

如果你需要有两个独立的 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 会通过一种称为 root_path 的 ASGI 规范机制来处理子应用的挂载路径。

这样,子应用就会知道使用该路径前缀来生成文档 UI。

子应用也可以有自己的挂载子应用,并且一切都会正常工作,因为 FastAPI 会自动处理所有这些 root_path

你将在关于 Behind a Proxy 的部分中了解更多关于 root_path 以及如何显式使用它的信息。