- FastAPIの概要を知りたい
- 公式チュートリアルを読むのが面倒
- 簡単な使い方をマスターしたい
FastAPI はフルスタックフレームワークの Django に比べると直感的かつシンプルでわかりやすいフレームワークですが、公式チュートリアルを読むのはそれなりの時間もかかります。
そこで FastAPI のエッセンスをサクッと学べるように、極力ムダを省き爆速でコーディングできるガイドをご用意しました。
FastAPIの基本的な使い方
いよいよここからは FastAPI を実際に使う手順を解説します。
Web 開発にあまり馴染みのない方でも極力わかりやすいように、深掘りして解説していきます。
インストール
次のいずれかのコマンドでライブラリをインストールできます。
# pipでインストール
pip install fastapi uvicorn[statndard]
# Poetryでインストール
poetry add fastapi "uvicorn[standard]"
uvicorn の後の [standard] をつけることで WebSockets、Gzip、Brotli、HTTP/2 などのサポートが追加されます。基本的につけておくと良いでしょう。
また、pip ではなく Petry を使いたい方はいくつかセットアップが必要です。以下の記事を参考に設定を済ませてから実行してください。
uvicornをインストールする理由
FastAPIはASGIサーバー上で動作するので、ASGIサーバーとして機能するuvicornも同時にインストールするのが一般的です。
ちなみにFastAPIとよく比較されるDjangoでは、伝統的にWSGIサーバー上で動作させることが多いです。ここでASGIとWSGIの違いをざっとまとめておきます。
- ASGI
非同期通信に対応しているので、複数のリクエストを同時処理が可能。
ウェブソケットなどの長期間の接続もサポート。 - WSGI
同期処理にしか対応していないので、一度に1つのリクエストしか処理できない。
つまり、たくさんのリクエストが集中するようなサービスを作るのであれば非同期処理に対応したASGIの方が優れています。
ただし、WSGIはコードが簡潔で直感的に理解しやすいので、パフォーマンスを求めなかったり小規模な開発であればかえってWSGIの方が優れていることもあります。
もっとも簡単なFastAPIのコード
試しに簡単なコードを書いてみましょう。
エンドポイントにアクセスすると{"Hello":"World"}
とだけ表示されるものです。
from fastapi import FastAPI
# FastAPIの初期化
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get
とすることで、引数内のアドレスにGETメソッドでアクセスがあった場合の動作を定義できます。
つまりここではルート(/
)にアクセスがあった場合には {Hello: World} を返す、という意味になるわけですね。
なお、FastAPI では Python オブジェクトを JSON に変換して返却してくれるという仕様があります。そのためここでは辞書型がリターンされていますが、クライアントには JSON オブジェクトが返されます。
ASGIサーバーの起動方法
ASGIサーバーを立ち上げるコマンドは以下になります。
# コマンドの形式
uvicorn [Pythonファイル名]:[起動するインスタンス名] --reload
# 実際のコマンド例
uvicorn main:app --reload
--reload
オプションをつけることで開発モードでアプリケーションを起動します。これにより、ソースコードが変更されるたびに uvicorn が再起動して変更内容が反映されます。
さて、上記を実行した後にブラウザからhttp://127.0.0.1:8000
にアクセスしてみてください。動作確認ができるはずです。
ドキュメントの表示方法
FastAPI では Swagger UIと ReDoc により、自動的にドキュメントが作成されます。
そのため、例えば開発サーバーを立ち上げている場合は以下の URL にアクセスするだけで簡単にドキュメントを確認できます。
- Swagger UI:http://localhost:8000/docs
- ReDoc:http://localhost:8000/redoc
ドキュメントを無効にしたり、エンドポイントを変更するには FastAPI に対して以下のように引数を渡します。
from fastapi import FastAPI
# Swagger UI, ReDocを無効化
app_invalidate = FastAPI(docs_url=None, redoc_url=None)
# Swagger UI, ReDocをカスタムパスに変更
app_custompath = FastAPI(docs_url="/custom-docs", redoc_url="/custom-redoc")
【重要概念】@appデコレーターについて
FastAPI を理解するための最重要概念は@app
デコレーターです。
この @app デコレーターにはいくつかの種類があり、それぞれの挙動や使い道を押さえておくと FastAPI による開発の幅が一気に開いていきます。
ルーティングを行うデコレータ
API開発においては、HTTPメソッドをフルに活用して開発が行われます。
以下、FastAPI のデコレータとHTTPメソッドの対応関係です。
HTTPメソッド | FastAPI デコレータ |
---|---|
GET | @app.get |
POST | @app.post |
PUT | @app.put |
PATCH | @app.patch |
DELETE | @app.delete |
ルーティングについて詳しく知りたい方は、以下の記事も併せてご覧ください。
続いては、デコレータの引数について解説します。
必須の引数である path の他にも、次のように多数のオプションを設定できます。
- path
リクエストを受け取る URL パスを定義します。 - response_model
エンドポイントから返されるレスポンスのデータ形式を定義します。
Pydantic モデルを指定することになります。 - status_code
成功時の HTTP ステータスコードを指定します。
デフォルト値は200番なので、例えば新しいリソースの作成(Create)の場合、”201″を指定することが多いです。 - tags
エンドポイントをグループ分けするためのタグを設定できます。
API ドキュメントでグループ化されるので、管理が簡単になります。 - summary と description
APIドキュメントに記載されるエンドポイントの概要と説明を記載します。
@app.on_eventデコレーター
@app.on_event
デコレーターには二種類の値を設定できます。
- startup
アプリの起動時に実行する関数を定義します。
例えば、データベース接続の確立や初期化処理を行うために使われます。 - shutdown
アプリの終了時に実行する関数を定義します。
例えば、データベース接続の解放やリソースのクリーンアップ用途に使われます。
次のサンプルコードはアプリの起動・終了をprintするだけのものです。
from fastapi import FastAPI
app = FastAPI()
@app.on_event("startup")
async def startup_event():
print("アプリケーションが起動しました")
@app.on_event("shutdown")
async def shutdown_event():
print("アプリケーションが終了しました")
@app.middleware(“http”)デコレーター
@app.middleware(“http”) デコレーターを使うことで、簡単にミドルウェアの実装ができます。
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
# リクエストを受けたタイミングでやりたい処理
...
response = await call_next(request)
# レスポンスを作成した後にやりたい処理
...
response.headers["Custom-Header"] = "Some value"
return response
上記のサンプルコードではレスポンスを返す時にカスタムヘッダーを加える処理を行っています。
call_next() 関数は FastAPI で特別な関数で、 response = await call_next(request) とすることでレスポンスが作成されるまで待つことができるようになります。
これにより、response = await call_next(request) の前後で処理を書き分けることにより便利に扱うことができるようになります。
まとめ
以上、FastAPI の操作でよく使われるメソッドを中心にご説明してきました。
Django などと比べるとかなり直感的に操作ができるので、初めて Web 系の開発にチャレンジしたい方にとってはフレームワークの有力な選択肢になってくるはずです。
なお、API開発が初めての方は『Web API: The Good Parts』が手元にあると非常に参考になります。
コメント