FastAPI入門

FastAPIの基本的部分のメモ。公式ドキュメントがわかりやすいため、公式ドキュメントのリンク集くらいのつもりでまとめています。

FastAPI

FastAPIの仕組みについて、分かりやすくまとめてくれている投稿。

FastAPIでStarletteとPydanticはどのように使われているか

環境

  • Python 3.9.7
  • FastAPI 0.70.0
  • uvicorn 0.15.0

インストール

$ pip install fastapi[all]
$ pip install uvicorn[standard]

Install FastAPI

記法

GET

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello"}


if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8080, timeout_keep_alive=0, log_level="debug", reload=True)

パス・パラメーター

Path Parameters

@app.get("/users/{name}")
async def get_name(name: str):
    return {"name": name}

クエリ・パラメーター

Query Parameters

from typing import Optional


@app.get("/users/id/{name}")
async def get_name_with_id(name: str, id: Optional[int] = None):
    return {"name": name, "id": id}

クエリ・パラメーターにバリデーション。

Query Parameters and String Validations

from fastapi import Query


@app.get("/v2/users/id/{name}")
async def get_name_with_id_validation(name: str, id: str = Query(..., regex="^[0-9]{2}$")):
    return {"name": name, "id": id}

POST

Request Body

from pydantic import BaseModel


class User(BaseModel):
    name: str
    age: Optional[int] = None


@app.post("/users/")
async def post_user(user: User):
    return user

pydanticのFieldメソッドを利用して、メタ情報を付与できます。

Body - Fields

Field customisation

from pydantic import Field


class UserWithMeta(BaseModel):
    name: str = Field(..., title="Name", description="Name of User")
    age: Optional[int] = Field(None, title="age", description="Age of User")


@app.post("/v2/users/")
async def post_user_with_meta(user: UserWithMeta):
    return user

response_modelを指定することで、レスポンス・ボディの型指定もできます。

Response Model

@app.post("/v3/users/", response_model=User)
async def post_by_response_model(user: User):
    return user

HTTPステータスコードの指定

Response Status Code

@app.get("/users/201/", status_code=201)
async def get_201():
    return {"Hello": "World"}

400番代のステータスは、以下のように例外を起こせます。

Handling Errors

from fastapi import HTTPException


@app.get("/users/404/")
async def get_404():
    raise HTTPException(status_code=404, detail="User not found")

起動

Uvicornの公式ドキュメントによると、Gunicornを介して動かせとある。

For production deployments we recommend using gunicorn with the uvicorn worker class.

Running with Gunicorn

Gunicornから起動。

$ gunicorn main:app -b 0.0.0.0:8080 --workers 1 --threads 8 --timeout 0 -k uvicorn.workers.UvicornWorker

最終的なコード

FastAPI Tutorial