2023年8月29日火曜日

fastapiでヘッダ情報とフォームデータを同時に扱う方法

fastapiでヘッダ情報とフォームデータを同時に扱う方法

概要

ヘッダは Depends で処理してフォームデータは BaseModel でリクエストとして処理します

環境

  • Python 3.11.3
  • fastapi 0.100.1
  • pydantic 2.1.1

サンプルコード

from typing import Self

from fastapi import Depends, FastAPI, Form, Request
from pydantic import BaseModel, field_validator

app = FastAPI()


async def get_action(request: Request) -> str:
    action = request.headers.get("Action", "default")
    return action


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)

    @field_validator("username")
    def validate_username(cls, v):
        if v != "hawksnowlog":
            raise ValueError("Invalid username.")
        return v


@app.get("/")
async def root(
    action: str = Depends(get_action), form_data: UserForm = Depends(UserForm.as_form)
):
    return action, form_data

動作確認

  • pipenv run uvicorn app:app --reload
  • curl -H "Action: Hoge" localhost:8000 -XGET -H "content-type: application/x-www-form-urlencoded" -d "username=hawksnowlog&password=pass"

=> ["Hoge",{"username":"hawksnowlog","password":"pass"}]

最後に

更にアクションに応じて処理する場合は一度ヘッダを取得したあとに別のルーティングをコールするなどの処理が必要なのかもしれない

0 件のコメント:

コメントを投稿