概要
fastapi でフォームデータを取得する方法を紹介します
クラス化して扱う方法も紹介します
環境
- macOS 13.4.1
- Python 3.11.3
- fastapi 0.98.0
インストール
- pipenv install fastapi
- pipenv install uvicorn
- pipenv install python-multipart
とりあえず動かすサンプルコード
- vim ./app.py
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
return {"username": username}
-
pipenv run uvicorn app:app --reload
-
curl localhost:8000/login/ -XPOST -H "content-type: application/x-www-form-urlencoded" -d "username=hawk&password=pass"
クラスにする
BaseModel を継承してそのクラス内で Form -> str への変換を行うクラスメソッドを定義します
更にそのクラスメソッドを Depends でコールすることで変換します
クラス化することでバリデーションも管理しやすくなります
- vim ./app.py
from typing import Self
from fastapi import Depends, FastAPI, Form
from pydantic import BaseModel, validator
app = FastAPI()
class UserForm(BaseModel):
username: str
password: str
@classmethod
def as_form(cls, username: str = Form(...), password: str = Form(...)) -> Self:
return cls(username=username, password=password)
@validator("username")
def validate_username(cls, v):
if v != "hawksnowlog":
raise ValueError("Invalid username.")
return v
@app.post("/login/")
async def login(form_data: UserForm = Depends(UserForm.as_form)):
return {"username": form_data.username, "password": form_data.password}
-
curl localhost:8000/login/ -XPOST -H "content-type: application/x-www-form-urlencoded" -d "username=hawk&password=pass"
=> InternalError
-
curl localhost:8000/login/ -XPOST -H "content-type: application/x-www-form-urlencoded" -d "username=hawksnowlog&password=pass"
=> 成功
最後に
fastapi でフォームデータを扱ってみました
ちゃんと BaseModel ベースで定義することもできるのでそこまで特殊なことをする必要はなさそうです
0 件のコメント:
コメントを投稿