どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

今更ながらFastAPIの使い方を勉強する

f:id:nogawanogawa:20200307185347p:plain

タイトルの通り、今更ながらFastAPIの使い方について一通り勉強したいと思います。 単純に流行りのツールを知っときたい意図です。

FastAPI

FastAPIはPythonのWeb frameworkの一つで、Flaskっぽくかけるマイクロフレームワークです。 ドキュメントはこちら。

fastapi.tiangolo.com

とにかくシンプルで強力なフレームワークなのは間違いなくて、先発のフレームワークより性能が良かったり、周辺機能が充実していたりします。 個人的にFastAPIの嬉しい点は、

  • 後発のフレームワークらしくFlaskより性能が高い
  • swaggerのドキュメントを自動生成してくれる

ってところでした。

使ってみる

環境構築

uvicornとnginxの全部入りのImageが公開されていますのでそちらを使用します。

github.com

これならプロダクションに持ってくのもスムーズかと思いますし、手元でササッと動かすにはちょうど良さそうです。

こちらをdocker-composeで動かしていきたいと思います。

書いてみる

初めて使うので、Tutorialを使ってやってみたいと思います。

fastapi.tiangolo.com

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"をエンドポイントにしてアクセスするだけです。

http://localhost/docs

f:id:nogawanogawa:20200310234911p:plain

使ったコード

今回使ったのはこんな感じです。

github.com

感想

個人的に、昨年ずっとFlaskを使っていたので、Flaskっぽく使えてドキュメントを自動で作ってくれるのは非常に嬉しいです。 FastAPIを使えばサーバーサイドの開発を進めていく際にも、ドキュメントが勝手に整備されていくのでチーム開発も非常にやりやすいと思います。 しばらくはPythonでサーバーサイドを作るときのファーストチョイスはFastAPIを考えるようにしていきたいなと思いました。