Modelos de Cookies¶
Si tienes un grupo decookies que están relacionadas, puedes crear unmodelo de Pydantic para declararlas. 🍪
Esto te permitiráreutilizar el modelo enmúltiples lugares y también declarar validaciones y metadatos para todos los parámetros a la vez. 😎
Nota
Esto es compatible desde la versión0.115.0 de FastAPI. 🤓
Consejo
Esta misma técnica se aplica aQuery,Cookie, yHeader. 😎
Cookies con un Modelo de Pydantic¶
Declara los parámetros decookie que necesites en unmodelo de Pydantic, y luego declara el parámetro comoCookie:
fromtypingimportAnnotatedfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):session_id:strfatebook_tracker:str|None=Nonegoogall_tracker:str|None=None@app.get("/items/")asyncdefread_items(cookies:Annotated[Cookies,Cookie()]):returncookies🤓 Other versions and variants
fromtypingimportAnnotated,UnionfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):session_id:strfatebook_tracker:Union[str,None]=Nonegoogall_tracker:Union[str,None]=None@app.get("/items/")asyncdefread_items(cookies:Annotated[Cookies,Cookie()]):returncookiesfromtypingimportUnionfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelfromtyping_extensionsimportAnnotatedapp=FastAPI()classCookies(BaseModel):session_id:strfatebook_tracker:Union[str,None]=Nonegoogall_tracker:Union[str,None]=None@app.get("/items/")asyncdefread_items(cookies:Annotated[Cookies,Cookie()]):returncookiesTip
Prefer to use theAnnotated version if possible.
fromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):session_id:strfatebook_tracker:str|None=Nonegoogall_tracker:str|None=None@app.get("/items/")asyncdefread_items(cookies:Cookies=Cookie()):returncookiesTip
Prefer to use theAnnotated version if possible.
fromtypingimportUnionfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):session_id:strfatebook_tracker:Union[str,None]=Nonegoogall_tracker:Union[str,None]=None@app.get("/items/")asyncdefread_items(cookies:Cookies=Cookie()):returncookiesFastAPIextraerá los datos paracada campo de lascookies recibidas en el request y te entregará el modelo de Pydantic que definiste.
Revisa la Documentación¶
Puedes ver las cookies definidas en la UI de la documentación en/docs:

Información
Ten en cuenta que, como losnavegadores manejan las cookies de maneras especiales y detrás de escenas,no permiten fácilmente queJavaScript las toque.
Si vas a laUI de la documentación de la API en/docs podrás ver ladocumentación de las cookies para tuspath operations.
Pero incluso sirellenas los datos y haces clic en "Execute", como la UI de la documentación funciona conJavaScript, las cookies no serán enviadas y verás unmensaje de error como si no hubieras escrito ningún valor.
Prohibir Cookies Extra¶
En algunos casos de uso especiales (probablemente no muy comunes), podrías quererrestringir las cookies que deseas recibir.
Tu API ahora tiene el poder de controlar su propioconsentimiento de cookies. 🤪🍪
Puedes usar la configuración del modelo de Pydantic paraprohibir cualquier campoextra:
fromtypingimportAnnotated,UnionfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):model_config={"extra":"forbid"}session_id:strfatebook_tracker:Union[str,None]=Nonegoogall_tracker:Union[str,None]=None@app.get("/items/")asyncdefread_items(cookies:Annotated[Cookies,Cookie()]):returncookies🤓 Other versions and variants
fromtypingimportAnnotatedfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):model_config={"extra":"forbid"}session_id:strfatebook_tracker:str|None=Nonegoogall_tracker:str|None=None@app.get("/items/")asyncdefread_items(cookies:Annotated[Cookies,Cookie()]):returncookiesfromtypingimportUnionfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelfromtyping_extensionsimportAnnotatedapp=FastAPI()classCookies(BaseModel):model_config={"extra":"forbid"}session_id:strfatebook_tracker:Union[str,None]=Nonegoogall_tracker:Union[str,None]=None@app.get("/items/")asyncdefread_items(cookies:Annotated[Cookies,Cookie()]):returncookiesTip
Prefer to use theAnnotated version if possible.
fromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):model_config={"extra":"forbid"}session_id:strfatebook_tracker:str|None=Nonegoogall_tracker:str|None=None@app.get("/items/")asyncdefread_items(cookies:Cookies=Cookie()):returncookiesTip
Prefer to use theAnnotated version if possible.
fromtypingimportUnionfromfastapiimportCookie,FastAPIfrompydanticimportBaseModelapp=FastAPI()classCookies(BaseModel):model_config={"extra":"forbid"}session_id:strfatebook_tracker:Union[str,None]=Nonegoogall_tracker:Union[str,None]=None@app.get("/items/")asyncdefread_items(cookies:Cookies=Cookie()):returncookiesSi un cliente intenta enviar algunascookies extra, recibirán un response deerror.
Pobres banners de cookies con todo su esfuerzo para obtener tu consentimiento para que laAPI lo rechace. 🍪
Por ejemplo, si el cliente intenta enviar una cookiesanta_tracker con un valor degood-list-please, el cliente recibirá un response deerror que le informa que la cookiesanta_trackerno está permitida:
{"detail":[{"type":"extra_forbidden","loc":["cookie","santa_tracker"],"msg":"Extra inputs are not permitted","input":"good-list-please",}]}Resumen¶
Puedes usarmodelos de Pydantic para declararcookies enFastAPI. 😎







