サーバーを手動で実行する¶
fastapi run
コマンドを使用する¶
要するに、FastAPI アプリケーションをサーブするには fastapi run
を使用します
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:single">main.py</u>
<font color="#3465A4">INFO </font> Using path <font color="#3465A4">main.py</font>
<font color="#3465A4">INFO </font> Resolved absolute path <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font>
<font color="#3465A4">INFO </font> Searching for package file structure from directories with <font color="#3465A4">__init__.py</font> files
<font color="#3465A4">INFO </font> Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
╭─ <font color="#8AE234"><b>Python module file</b></font> ─╮
│ │
│ 🐍 main.py │
│ │
╰──────────────────────╯
<font color="#3465A4">INFO </font> Importing module <font color="#4E9A06">main</font>
<font color="#3465A4">INFO </font> Found importable FastAPI app
╭─ <font color="#8AE234"><b>Importable FastAPI app</b></font> ─╮
│ │
│ <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822"> </span> │
│ │
╰──────────────────────────╯
<font color="#3465A4">INFO </font> Using import string <font color="#8AE234"><b>main:app</b></font>
<font color="#4E9A06">╭─────────── FastAPI CLI - Production mode ───────────╮</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ Serving at: http://0.0.0.0:8000 │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ API docs: http://0.0.0.0:8000/docs │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ Running in production mode, for development use: │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">│ </font><font color="#8AE234"><b>fastapi dev</b></font><font color="#4E9A06"> │</font>
<font color="#4E9A06">│ │</font>
<font color="#4E9A06">╰─────────────────────────────────────────────────────╯</font>
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">2306215</font>]
<font color="#4E9A06">INFO</font>: Waiting for application startup.
<font color="#4E9A06">INFO</font>: Application startup complete.
<font color="#4E9A06">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8000</b> (Press CTRL+C to quit)
ほとんどの場合、それでうまくいくでしょう。😎
たとえば、このコマンドを使用して、コンテナ内、サーバー内などで FastAPI アプリを起動できます。
ASGI サーバー¶
もう少し詳しく見ていきましょう。
FastAPI は、ASGI と呼ばれる Python Web フレームワークおよびサーバーを構築するための標準を使用しています。 FastAPI は ASGI Web フレームワークです。
FastAPI アプリケーション (またはその他の ASGI アプリケーション) をリモートサーバーマシンで実行するために必要な主なものは、Uvicorn のような ASGI サーバープログラムです。これは、fastapi
コマンドにデフォルトで含まれているものです。
以下のような、いくつかの代替手段があります
- Uvicorn: 高性能な ASGI サーバー。
- Hypercorn: HTTP/2 や Trio と互換性のある ASGI サーバー。
- Daphne: Django Channels 用に構築された ASGI サーバー。
- Granian: Python アプリケーション用の Rust HTTP サーバー。
- NGINX Unit: NGINX Unit は軽量で汎用性の高い Web アプリケーションランタイムです。
サーバーマシンとサーバープログラム¶
覚えておくべき名前に関するちょっとした詳細があります。💡
「サーバー」という言葉は、リモート/クラウドコンピューター(物理または仮想マシン)と、そのマシンで実行されているプログラム(例:Uvicorn)の両方を指すのに一般的に使用されます。
「サーバー」という言葉を読むときは、これら 2 つのどちらかを指している可能性があることに留意してください。
リモートマシンを指す場合は、サーバーだけでなく、マシン、VM(仮想マシン)、ノードとも呼ばれます。これらはすべて、通常 Linux を実行している、プログラムを実行する何らかのリモートマシンを指します。
サーバープログラムのインストール¶
FastAPI をインストールすると、本番サーバーである Uvicorn が付属しており、fastapi run
コマンドで起動できます。
ただし、ASGI サーバーを手動でインストールすることもできます。
仮想環境を作成し、アクティブ化してから、サーバーアプリケーションをインストールしてください。
たとえば、Uvicorn をインストールするには
$ pip install "uvicorn[standard]"
---> 100%
同様のプロセスが、他の ASGI サーバープログラムにも適用されます。
ヒント
standard
を追加すると、Uvicorn は推奨される追加の依存関係をインストールして使用します。
これは、asyncio
の高性能なドロップイン代替である uvloop
を含んでおり、大きな並行処理パフォーマンスの向上を提供します。
pip install "fastapi[standard]"
のように FastAPI をインストールすると、uvicorn[standard]
も同時にインストールされます。
サーバープログラムの実行¶
ASGIサーバーを手動でインストールした場合、通常、FastAPIアプリケーションをインポートするために、特別な形式でインポート文字列を渡す必要があります。
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
注意
コマンド uvicorn main:app
は以下を指します。
main
: ファイルmain.py
(Pythonの「モジュール」)。app
:main.py
内でapp = FastAPI()
の行で作成されたオブジェクト。
これは以下と同等です。
from main import app
代替のASGIサーバープログラムそれぞれに類似のコマンドがあります。詳細はそれぞれのドキュメントを参照してください。
警告
Uvicornや他のサーバーは、開発中に便利な --reload
オプションをサポートしています。
--reload
オプションは、より多くのリソースを消費し、不安定になるなどの問題があります。
これは開発中に非常に役立ちますが、本番環境では使用するべきではありません。
デプロイの概念¶
これらの例では、サーバープログラム(例:Uvicorn)を、定義済みのポート(例:80
)のすべてのIP(0.0.0.0
)でリッスンする単一のプロセスを開始して実行します。
これが基本的な考え方です。しかし、おそらく以下のような追加の事項を考慮する必要があるでしょう。
- セキュリティ - HTTPS
- 起動時の実行
- 再起動
- レプリケーション(実行中のプロセスの数)
- メモリ
- 開始前の事前ステップ
これらの各概念、それらについての考え方、そしてそれらを処理するための戦略を使用した具体的な例について、次の章で詳しく説明します。🚀