\ ポイント最大11倍! /

【入門編】FastAPIスピードマスターガイド

  • 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 を使いたい方はいくつかセットアップが必要です。以下の記事を参考に設定を済ませてから実行してください。

Poetryで角括弧[]のついたコマンドを実行する際には、シェルが各括弧を特殊な意味で解釈しないように""で囲む必要があるので注意が必要です。

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 オブジェクトが返されます。

実際に Hello World を表示させるには、ASGI サーバーを立ち上げる必要があります。

ASGIサーバーの起動方法

ASGIサーバーを立ち上げるコマンドは以下になります。

# コマンドの形式
uvicorn [Pythonファイル名]:[起動するインスタンス名] --reload

# 実際のコマンド例
uvicorn main:app --reload

--reloadオプションをつけることで開発モードでアプリケーションを起動します。これにより、ソースコードが変更されるたびに uvicorn が再起動して変更内容が反映されます。

さて、上記を実行した後にブラウザからhttp://127.0.0.1:8000にアクセスしてみてください。動作確認ができるはずです。

ポートを変更したい場合には--port 8001のように指定することもできます。

ドキュメントの表示方法

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
デコレータとHTTPメソッドの関係

ルーティングについて詳しく知りたい方は、以下の記事も併せてご覧ください。

続いては、デコレータの引数について解説します。

必須の引数である path の他にも、次のように多数のオプションを設定できます。

  • path
    リクエストを受け取る URL パスを定義します。
  • response_model
    エンドポイントから返されるレスポンスのデータ形式を定義します。
    Pydantic モデルを指定することになります。
  • status_code
    成功時の HTTP ステータスコードを指定します。
    デフォルト値は200番なので、例えば新しいリソースの作成(Create)の場合、”201″を指定することが多いです。
  • tags
    エンドポイントをグループ分けするためのタグを設定できます。
    API ドキュメントでグループ化されるので、管理が簡単になります。
  • summarydescription
    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』が手元にあると非常に参考になります。

¥2,420 (2024/10/05 18:33時点 | Amazon調べ)

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Pythonが得意。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)