タイトルの通り、今更ながらFastAPIの使い方について一通り勉強したいと思います。 単純に流行りのツールを知っときたい意図です。
FastAPI
FastAPIはPythonのWeb frameworkの一つで、Flaskっぽくかけるマイクロフレームワークです。 ドキュメントはこちら。
とにかくシンプルで強力なフレームワークなのは間違いなくて、先発のフレームワークより性能が良かったり、周辺機能が充実していたりします。 個人的にFastAPIの嬉しい点は、
- 後発のフレームワークらしくFlaskより性能が高い
- swaggerのドキュメントを自動生成してくれる
ってところでした。
使ってみる
環境構築
uvicornとnginxの全部入りのImageが公開されていますのでそちらを使用します。
これならプロダクションに持ってくのもスムーズかと思いますし、手元でササッと動かすにはちょうど良さそうです。
こちらをdocker-composeで動かしていきたいと思います。
書いてみる
初めて使うので、Tutorialを使ってやってみたいと思います。
HelloWorld
はじめはHelloWorldをやってみます。
from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"}
コンテナを立ち上げて確認します。
docker-compose up
これでHelloWorldと応答があるかと思います。
$ curl http://localhost {"message":"Hello World"}
上の実装で書かれている様に、jsonでの応答が必要なときは、pythonのdictionaryをreturnするだけです。
PATH パラメータ
URLの末尾をパラメータとして取得する方法を確認します。
@app.get("/items/{item_id}") async def read_item(item_id): return {"item_id": item_id}
末尾のパラメータを取得してそのまま返すようになっています。 アクセスするとこんな感じです。
$ curl http://localhost/items/hoge {"item_id":"hoge"}
メソッドの引数の型を指定することで、パラメータのバリデーションとかもできるみたいです。
Query パラメータ
GETメソッドでのクエリパラメータの受け取り方を確認します。
@app.get("/query/") async def query_parameter(skip: int): return {"skip": skip}
エンドポイントで特に指定しないで、メソッドの引数だけ指定する感じにします。 これにアクセスするとこんな感じです。
$ curl http://localhost/query/?skip=3 {"skip":3}
リクエストボディ
POSTメソッドなどでのリクエストボディの受け取り方を確認します。
from pydantic import BaseModel class Item(BaseModel): name: str price: float @app.post("/request/") async def create_item(item: Item): return item
リクエストボディをクラスで定義して指定するんですね。
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"fuga", "price":100.0}' localhost/request/ {"name":"fuga","price":100.0}
ファイルアップロード
ファイルのアップロードの方法について確認します。
from fastapi import FastAPI, File, UploadFile @app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...)): return {"filename": file.filename}
適当にファイルを送信してみます。
$ curl -F file=@/path/to/file http://localhost/uploadfile/ {"filename":"<filename>"}
ドキュメント
最後にドキュメントの作成方法について確認します。 FastAPIではドキュメントはメソッドの中身などから自分で判断してswaggerを自動で作成します。
中身を確認するときは、"/docs"をエンドポイントにしてアクセスするだけです。
使ったコード
今回使ったのはこんな感じです。
感想
個人的に、昨年ずっとFlaskを使っていたので、Flaskっぽく使えてドキュメントを自動で作ってくれるのは非常に嬉しいです。 FastAPIを使えばサーバーサイドの開発を進めていく際にも、ドキュメントが勝手に整備されていくのでチーム開発も非常にやりやすいと思います。 しばらくはPythonでサーバーサイドを作るときのファーストチョイスはFastAPIを考えるようにしていきたいなと思いました。