サブアプリケーション - マウント¶
それぞれ独立した OpenAPI とドキュメント UI を持つ 2 つの独立した FastAPI アプリケーションが必要な場合は、メイン アプリケーションを作成し、1 つ(または複数)のサブアプリケーションを「マウント」することができます。
**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
を自動的に処理するため、すべて正しく機能します。
root_path
とその明示的な使用方法の詳細については、プロキシの背後 のセクションで説明します。