विषय पर बढ़ें

Cookie Parameter Models

🌐 एआई और मनुष्यों द्वारा किया गया अनुवाद

यह अनुवाद मनुष्यों के मार्गदर्शन में एआई द्वारा किया गया है। 🤝

इसमें मूल अर्थ को गलत समझने या अप्राकृतिक लगने आदि जैसी गलतियाँ हो सकती हैं। 🤖

आप हमें एआई LLM को बेहतर मार्गदर्शन करने में मदद करके इस अनुवाद को बेहतर बना सकते हैं।

अंग्रेज़ी संस्करण

अगर आपके पास संबंधित cookies का एक समूह है, तो आप उन्हें declare करने के लिए एक Pydantic model बना सकते हैं। 🍪

यह आपको model को फिर से उपयोग करने की अनुमति देगा, कई जगहों पर, और साथ ही सभी parameters के लिए validations और metadata एक साथ declare करने की भी। 😎

नोट

यह FastAPI version 0.115.0 से supported है। 🤓

सुझाव

यही तकनीक Query, Cookie, और Header पर लागू होती है। 😎

Pydantic Model के साथ Cookies

जिन cookie parameters की आपको ज़रूरत है, उन्हें एक Pydantic model में declare करें, और फिर parameter को Cookie के रूप में declare करें:

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
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

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 request में प्राप्त cookies से हर field के लिए data extract करेगा और आपको वह Pydantic model देगा जिसे आपने define किया है।

Docs देखें

आप /docs पर docs UI में defined cookies देख सकते हैं:

नोट

ध्यान रखें कि, क्योंकि browsers cookies को विशेष तरीकों से और पर्दे के पीछे handle करते हैं, वे JavaScript को आसानी से उन्हें छूने की अनुमति नहीं देते।

अगर आप /docs पर API docs UI पर जाते हैं, तो आप अपने path operations के लिए cookies की documentation देख पाएँगे।

लेकिन भले ही आप data भरें और "Execute" पर क्लिक करें, क्योंकि docs UI JavaScript के साथ काम करता है, cookies नहीं भेजे जाएँगे, और आपको एक error message दिखाई देगा जैसे कि आपने कोई values लिखी ही न हों।

Extra Cookies को forbid करें

कुछ विशेष use cases में (शायद बहुत आम नहीं), आप उन cookies को restrict करना चाह सकते हैं जिन्हें आप प्राप्त करना चाहते हैं।

आपकी API के पास अब अपनी खुद की cookie सहमति को control करने की शक्ति है। 🤪🍪

आप Pydantic के model configuration का उपयोग करके किसी भी extra fields को 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
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

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

अगर कोई client कुछ extra cookies भेजने की कोशिश करता है, तो उन्हें एक error response मिलेगा।

बेचारे cookie banners, जो API द्वारा उसे reject किए जाने के लिए आपकी सहमति पाने में इतनी मेहनत करते हैं। 🍪

उदाहरण के लिए, अगर client good-list-please value के साथ एक santa_tracker cookie भेजने की कोशिश करता है, तो client को एक error response मिलेगा जो बताएगा कि santa_tracker cookie की अनुमति नहीं है:

{
    "detail": [
        {
            "type": "extra_forbidden",
            "loc": ["cookie", "santa_tracker"],
            "msg": "Extra inputs are not permitted",
            "input": "good-list-please",
        }
    ]
}

सारांश

आप FastAPI में cookies declare करने के लिए Pydantic models का उपयोग कर सकते हैं। 😎