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]
記法
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)
パス・パラメーター
@app.get("/users/{name}") async def get_name(name: str): return {"name": name}
クエリ・パラメーター
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
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メソッドを利用して、メタ情報を付与できます。
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
を指定することで、レスポンス・ボディの型指定もできます。
@app.post("/v3/users/", response_model=User) async def post_by_response_model(user: User): return user
HTTPステータスコードの指定
@app.get("/users/201/", status_code=201) async def get_201(): return {"Hello": "World"}
400番代のステータスは、以下のように例外を起こせます。
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.
Gunicornから起動。
$ gunicorn main:app -b 0.0.0.0:8080 --workers 1 --threads 8 --timeout 0 -k uvicorn.workers.UvicornWorker