2023年7月3日月曜日

fastapiでフォームデータを受け取る方法

fastapiでフォームデータを受け取る方法

概要

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 件のコメント:

コメントを投稿