子應用程式 - 掛載¶
若你需要兩個彼此獨立的 FastAPI 應用程式,各自擁有獨立的 OpenAPI 與文件 UI,你可以有一個主應用,並「掛載」一個(或多個)子應用程式。
掛載一個 FastAPI 應用程式¶
「掛載」是指在某個特定路徑下加入一個完全「獨立」的應用程式,之後該應用程式會負責處理該路徑底下的一切,使用該子應用程式中宣告的路徑操作(path operation)。
頂層應用程式¶
先建立主(頂層)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 與如何顯式使用它。