Traffine I/O

日本語

2022-07-04

FastAPI

FastAPIとは

FastAPIは、Python 3.6以上で使用される最新の高性能Webフレームワークで、API(Application Programming Interfaces)を構築するために使用されます。FastAPIは、WebルーティングにはStarletteを、データのバリデーションと設定管理にはPydanticを使用して構築されています。これらの依存関係により、FastAPIは高速性と信頼性が確保され、現代のWeb開発において優れた選択肢となっています。

FastAPIは、2018年12月に初めて一般に公開されました。それ以来、その速度、使いやすさ、包括的な機能セットにより、大きな人気を集めています。

FastAPIの主な機能

FastAPIのもっとも注目すべき特徴の1つは、その速度です。他の人気のあるPythonフレームワークと比較して、FastAPIはパフォーマンスと開発の速さの両方で優れたパフォーマンスを発揮します。FastAPIは、現在利用可能な最速のPythonフレームワークの1つであり、Node.jsやGoにわずかに劣る程度です。

FastAPIはPythonの型ヒント機能を中心に設計されています。型ヒントは、関数の引数や戻り値の予想される型を開発者が示すことができるPythonの機能です。FastAPIはこれらの型ヒントを使用してデータのバリデーション、シリアライズ、ドキュメント化を処理し、バグが少なく、よりクリーンなコードを実現します。

FastAPIは、自動的な対話型APIドキュメントでも知られています。FastAPIで新しいAPIエンドポイントを作成すると、フレームワークはSwagger UIまたはReDocを使用してそのエンドポイント用の対話型ドキュメントページを自動生成します。この機能により、開発者やユーザーはAPIとやり取りし、その機能を理解し、さまざまなパラメータをテストして応答を確認することができます。全てをWebブラウザから行うことができます。

FastAPIのもう1つの注目すべき特徴は、非同期リクエスト処理の堅牢なサポートです。非同期WebフレームワークであるStarletteを基に構築されたFastAPIは、Pythonのネイティブなasyncとawaitキーワードをサポートしており、IOバウンドの操作を効率的に処理するために非同期コードを記述することができます。

FastAPIはまた、OAuth2認証、JSON Web Token、クエリパラメータ、リクエストボディ、パスパラメータ、クッキー、ヘッダー、その他のHTTP機能のサポートも提供しており、堅牢で安全なWeb APIを構築するための包括的なツールです。

インストール

FastAPIはPython Package Index(PyPI)でパッケージとして利用可能であり、pipを使用してインストールすることができます。

bash
$ pip install fastapi

FastAPIを実行するには、ASGI(Web Server Gateway Interface)サーバーが必要です。UvicornはASGIサーバーの1つであり、uvloopとhttptoolsを使用した高速なASGIサーバーの実装です。

bash
$ pip install uvicorn

FastAPIアプリケーションの作成

ルートの定義

FastAPIでは、ルートはアプリケーション内のエンドポイントを定義する方法です。エンドポイントはAPIにアクセスできる特定のURLです。FastAPIでは、Pythonの関数、または「パスオペレーション」とも呼ばれるものを使用してルートを定義します。

まず、単一のルートを持つシンプルなFastAPIアプリケーションを作成します。お好きなコードエディタを開き、main.pyという新しいPythonファイルを作成し、以下のコードを記述します。

main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

上記のコードでは、まずFastAPIクラスをインポートします。次に、このクラスのインスタンスを作成し、変数appに割り当てます。このインスタンスはAPIとの主要なやり取りポイントとなります。

次に、@app.get("/")デコレータを使用してルートを定義します。このデコレータは、下にある関数がGETリクエストがルート("/")URLに対して行われた場合に呼び出されることをFastAPIに伝えます。read_root()関数は単純にJSONレスポンスを返します({"Hello": "World"})。

アプリケーションの実行

最初のルートが定義されたので、FastAPIアプリケーションを実行することができます。これを行うには、ターミナルまたはコマンドプロンプトを開き、main.pyファイルが含まれるディレクトリに移動し、次のコマンドを入力します。

bash
$ uvicorn main:app --reload

ここで、main:appはUvicornに、main.pyファイル内のappという名前のアプリケーションインスタンスを探すよう指示します。--reloadフラグはホットリローディングを有効にし、コードを変更するたびにサーバーが自動的に更新されることを意味します。

Uvicornが実行されると、Webブラウザを開き、http://localhost:8000/にアクセスします。そこに{"Hello": "World"}というテキストのJSONレスポンスが表示されるはずです。

FastAPIのデータ処理

この章では、FastAPIがリクエストボディ、クエリパラメータ、およびパスパラメータの形式でデータをどのように処理するかについて詳しく見ていきます。

リクエストボディ

FastAPIでは、HTTPメソッド(POSTやPUTなど)のリクエストボディをPydanticモデルを使用して読み取ることができます。Pydanticモデルを使用すると、データ構造を定義し、バリデーション、シリアライズ、ドキュメント化を自動的に処理することができます。

例を見てみます。まず、Pydanticモデルを定義します。

python
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    quantity: int

ここでは、namepricequantityは必須フィールドであり、descriptionはオプションです。

次に、このモデルをルートで使用します。

python
@app.post("/items/")
def create_item(item: Item):
    return item

このルートでは、FastAPIはリクエストボディでItemモデルと同じ構造のJSONオブジェクトを期待します。FastAPIはデータを自動的にバリデーションし、Pydanticモデルにシリアライズし、ルート関数に含めます。

クライアントは、curlコマンドを使用してJSONオブジェクトをリクエストボディとしてこのルートに対してPOSTリクエストを送信することができます。以下はcurlコマンドを使用した例です。

bash
$ curl -X POST "http://localhost:8000/items/" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"name\":\"Foo\",\"price\":50.5,\"quantity\":10}"

クエリパラメータ

クエリパラメータはURLの?以降に記述され、通常はコンテンツのソートやフィルタリングに使用されます。FastAPIはクエリパラメータの処理を非常に簡単にします。

クエリパラメータを受け入れるルートを追加してみます。

python
@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):
    return items[skip : skip + limit]

この例では、skiplimitはオプションのクエリパラメータで、デフォルト値はそれぞれ010です。

クライアントは、URLのクエリパラメータを含むGETリクエストをこのルートに送信することができます。以下はcurlコマンドを使用した例です。

bash
$ curl -X GET "http://localhost:8000/items/?skip=20&limit=10" -H "accept: application/json"

パスパラメータ

パスパラメータ(またはパス変数)は、URLパスの一部である変数です。関数の引数として定義することができます。

FastAPIでパスパラメータを使用する方法を見てみます。

python
@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

このルートでは、item_idはパスパラメータであり、FastAPIはURLから抽出し、ルート関数に引数として渡します。

クライアントは、GETリクエストをこのルートに対して送信し、URLパスにアイテムIDを含めることができます。以下はcurlコマンドを使用した例です。

bash
$ curl -X GET "http://localhost:8000/items/5" -H "accept: application/json"

参考

https://fastapi.tiangolo.com/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!