概要
ヘッダは 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 件のコメント:
コメントを投稿