跳转至

子应用 - 挂载

🌐 Translation by AI and humans

This translation was made by AI guided by humans. 🤝

It could have mistakes of misunderstanding the original meaning, or looking unnatural, etc. 🤖

You can improve this translation by helping us guide the AI LLM better.

English version

如果需要两个独立的 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)
🤓 Other versions and variants
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)
🤓 Other versions and variants
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)
🤓 Other versions and variants
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 机制处理挂载子应用路径之间的通信。

这样,子应用就可以为自动文档使用路径前缀。

并且子应用还可以再挂载子应用,一切都会正常运行,FastAPI 可以自动处理所有 root_path

关于 root_path 及如何显式使用 root_path 的内容,详见使用代理一章。