地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

fastapiを早速使ってみた

概要

最近話題のfastapiを早速使ってみた記事

fastapiとは

Python製のASGI Web フレームワーク。ジャンル的にはFlaskのようなマイクロフレームワークになるみたいです。公式でも謳ってる「パフォーマンス、使いやすさ、運用設計」なんかが強いとのこと。後ドキュメント自動生成がとても便利

GitHubのスター自体もすでに20.0kを超えていてとても勢いのある類に入ると思います。

github.com

インストール

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が開きます。

f:id:ryuichi1208:20200904092906p:plain

公式サンプルにもあるように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を使ってエンドポイントを定義します。そのエンドポイントにリクエストを投げると即座に帰ってくることが確認できます。

qiita.com