使用ライブラリ
- Fast API
- Pydantic
- SQLAlchemy
FastAPI
FastAPIとは
Pythonの標準である型ヒントに基づいてAPI を構築するための、モダンで高速(高パフォーマンス)なWeb フレームワーク
FastAPIの特徴
- Pythonのフレームワークの中では速い
- Flaskの構文に近いので、Flaskを学習したことある人からすると学習コストが低い
- Python3.5から導入された非同期処理(async/await)がフレームワークレベルでサポート
-
APIのドキュメントが自動で生成
-
OpenAPIフォーマット
- yaml / JSONで書かれたREST APIのドキュメント
-
FastAPI上で2種類の方法で表示できる
- Swagger UI
-
ReDoc
- Swagger UIより新しい
-
OpenAPIフォーマット
-
型チェックによりAPIの入力値の型を制御できる
- 型チェックにはPydanticが使われている
- エンジニアブログでも紹介
FastAPIの使い方
最もシンプルなFastAPI
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
パスパラメータ
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id):
return {"item_id": item_id}
クエリパラメータ
from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
return fake_items_db[skip : skip + limit]
SQLAlchemy
FastAPIとよく一緒に使用されるORM(Object-Relational Mapping) の一つ
クラスオブジェクトとRDBテーブルとのマッピングを行うもの
- SQLデータベースの構造を定義するためのクラス
from sqlalchemy.orm import Mapped, mapped_column
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[str] = mapped_column(unique=True, nullable=False)
password: Mapped[str] = mapped_column(nullable=False)
name: Mapped[str] = mapped_column(nullable=False)
SQLAlchemyのDB操作
-
SQLっぽい操作の
query()
、ORMっぽい操作のscalars()
がある-
scalars
推奨
-
from sqlalchemy import select
from .models import User
def get_user(db: Session, user_id: int):
return db.scalars(select(User).where(User.id == user_id)).first()
# Primary Key指定であればget()の方がシンプルに使える
# return db.get(User, user_id)
# async/await対応版
# AsyncSessionを使うこと、asyn・awaitが追加になること以外は同一
async def get_user(db: AsyncSession, user_id: int):
return await db.scalars(select(User).where(User.id == user_id)).first()
Pydantic BaseModel
データの入力/出力を定義するためのクラス
from pydantic import BaseModel, EmailStr
class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: str | None = None
uvicorn
-
Uvicorn
は、Pythonの非同期Webサーバーの一つ - FastAPIやStarletteなどの非同期Webフレームワークと組み合わせて使用されることが多い
-
非常に高速で、
ASGI (Asynchronous Server Gateway Interface)
をサポートしており、非同期のリクエスト処理に優れている
uvicorn app.main:app --proxy-headers --host 0.0.0.0 --port 80