概要
最近話題のfastapiを早速使ってみた記事
fastapiとは
Python製のASGI Web フレームワーク。ジャンル的にはFlaskのようなマイクロフレームワークになるみたいです。公式でも謳ってる「パフォーマンス、使いやすさ、運用設計」なんかが強いとのこと。後ドキュメント自動生成がとても便利
GitHubのスター自体もすでに20.0kを超えていてとても勢いのある類に入ると思います。
インストール
pipで入ります。
$ pip install fastapi uvicorn
起動
公式にあるサンプルコードです。app.pyと言った形で保存しておきます。
from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q}
上記を保存したらサーバを起動させます。file名:FastAPI()のインスタンス名で起動です。8000番でLISTENするのでそこへcurlを投げて疎通確認ができます。(--hostやら--portで起動情報は変更可能です。)
$ uvicorn app:app INFO: Started server process [19588] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: 127.0.0.1:52547 - "GET /docs HTTP/1.1" 200 OK
ドキュメント
http://127.0.0.1:8000/docs をブラウザで開くすでにAPIが反映されたSwagger UIが開きます。
公式サンプルにもあるようにpythonのコードで型ヒントを定義しておけばそちらも合わせてSwaggerの方に反映されます。
デフォルト値やdocstringを書いておくことでこちらもSwagger UIの方に自動で反映してくれます。
@app.get("/items/{item_id}/{srt_mode}") def read_items(item_id: int,srt_mode: str , q: Optional[str] = ["aaa"]): """ test api """ return {"item_id": item_id, "q": q}
asyncも簡単に
リクエストを送ってみると、クライアント側には即座にレスポンスが返り、時間のかかる処理はバックグラウンドで処理できるasyncを使ってみます。
@app.get("/async", status_code=202) async def sleep_async(): asyncio.sleep(30) return {"hello": "async"}
非同期sleepを使ってエンドポイントを定義します。そのエンドポイントにリクエストを投げると即座に帰ってくることが確認できます。