쿠키 파라미터 모델
쿠키 파라미터 모델 (Cookie Parameter Models)
서로 관련된 쿠키들이 여러 개 있다면, Pydantic 모델로 한 번에 선언할 수 있어요. 🍪
이렇게 하면 모델을 여러 곳에서 재사용할 수 있고, 모든 파라미터에 대한 검증과 메타데이터를 한꺼번에 선언할 수 있어요. 😎
참고: 이 기능은 FastAPI 버전
0.115.0부터 지원돼요. 🤓이 기법은
Query,Cookie,Header모두에 똑같이 적용돼요. 😎
출처: 공식문서
Pydantic 모델로 쿠키 선언하기 (Cookies with a Pydantic Model)
필요한 쿠키 파라미터를 Pydantic 모델에 선언하고, 그 파라미터를 Cookie로 선언하면 돼요:
from typing import Annotated
from fastapi import Cookie, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Cookies(BaseModel):
session_id: str
fatebook_tracker: str | None = None
googall_tracker: str | None = None
@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
return cookies
파이썬 3.10+ -
Annotated를 안 쓰는 버전: 가능하면Annotated버전을 쓰는 걸 권해요.from fastapi import Cookie, FastAPI from pydantic import BaseModel app = FastAPI() class Cookies(BaseModel): session_id: str fatebook_tracker: str | None = None googall_tracker: str | None = None @app.get("/items/") async def read_items(cookies: Cookies = Cookie()): return cookies
FastAPI는 요청에서 받은 각 쿠키의 데이터를 필드별로 추출해서, 우리가 정의한 Pydantic 모델을 만들어 줘요. 즉 session_id, fatebook_tracker, googall_tracker 쿠키가 자동으로 모델의 해당 필드로 채워져요.
문서 확인하기 (Check the Docs)
/docs의 문서 UI에서 정의된 쿠키를 확인할 수 있어요.
주의: 브라우저가 쿠키를 특별하게, 그리고 뒤에서 조용히 처리하기 때문에 JavaScript로는 쿠키를 쉽게 건드리지 못해요.
/docs의 API 문서 UI에서 path operation의 쿠키 문서를 볼 수는 있지만, 데이터를 채우고 "Execute"를 눌러도 문서 UI는 JavaScript 기반이라 쿠키가 전송되지 않아요. 그래서 값을 아무것도 안 적은 것처럼 오류 메시지를 보게 될 거예요.
추가 쿠키 금지하기 (Forbid Extra Cookies)
아마 흔하지는 않겠지만, 특별한 경우에 받고 싶은 쿠키를 제한하고 싶을 수 있어요. 이제 API가 자기만의 쿠키 동의(consent)를 제어할 수 있게 된 거죠. 🤪
Pydantic의 모델 설정으로 extra 필드를 forbid하면 돼요:
from typing import Annotated
from fastapi import Cookie, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Cookies(BaseModel):
model_config = {"extra": "forbid"}
session_id: str
fatebook_tracker: str | None = None
googall_tracker: str | None = None
@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
return cookies
파이썬 3.10+ -
Annotated를 안 쓰는 버전:from fastapi import Cookie, FastAPI from pydantic import BaseModel app = FastAPI() class Cookies(BaseModel): model_config = {"extra": "forbid"} session_id: str fatebook_tracker: str | None = None googall_tracker: str | None = None @app.get("/items/") async def read_items(cookies: Cookies = Cookie()): return cookies
model_config = {"extra": "forbid"}를 넣으면, 모델에 선언되지 않은 쿠키가 오면 FastAPI가 오류를 내요. 즉 API가 받아들이는 쿠키의 목록을 정확히 통제할 수 있게 돼요.