विषय पर बढ़ें

Header Parameter Models

AI coding agents

Use the official FastAPI skill for your installed version. Install it from your project directory:

uvx library-skills

See Develop with AI.

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

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

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

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

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

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

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

नोट

यह FastAPI version 0.115.0 से समर्थित है। 🤓

Pydantic Model के साथ Header Parameters

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

from typing import Annotated

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class CommonHeaders(BaseModel):
    host: str
    save_data: bool
    if_modified_since: str | None = None
    traceparent: str | None = None
    x_tag: list[str] = []


@app.get("/items/")
async def read_items(headers: Annotated[CommonHeaders, Header()]):
    return headers
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class CommonHeaders(BaseModel):
    host: str
    save_data: bool
    if_modified_since: str | None = None
    traceparent: str | None = None
    x_tag: list[str] = []


@app.get("/items/")
async def read_items(headers: CommonHeaders = Header()):
    return headers

FastAPI request में headers से हर field का data extract करेगा और आपको वह Pydantic model देगा जिसे आपने define किया है।

Docs देखें

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

Extra Headers को मना करें

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

आप Pydantic की model configuration का उपयोग करके किसी भी extra fields को forbid कर सकते हैं:

from typing import Annotated

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class CommonHeaders(BaseModel):
    model_config = {"extra": "forbid"}

    host: str
    save_data: bool
    if_modified_since: str | None = None
    traceparent: str | None = None
    x_tag: list[str] = []


@app.get("/items/")
async def read_items(headers: Annotated[CommonHeaders, Header()]):
    return headers
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class CommonHeaders(BaseModel):
    model_config = {"extra": "forbid"}

    host: str
    save_data: bool
    if_modified_since: str | None = None
    traceparent: str | None = None
    x_tag: list[str] = []


@app.get("/items/")
async def read_items(headers: CommonHeaders = Header()):
    return headers

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

उदाहरण के लिए, अगर client plumbus के value के साथ एक tool header भेजने की कोशिश करता है, तो उन्हें एक error response मिलेगा जो बताएगा कि header parameter tool की अनुमति नहीं है:

{
    "detail": [
        {
            "type": "extra_forbidden",
            "loc": ["header", "tool"],
            "msg": "Extra inputs are not permitted",
            "input": "plumbus",
        }
    ]
}

Convert Underscores को Disable करें

नियमित header parameters की तरह ही, जब parameter names में underscore characters होते हैं, तो वे स्वचालित रूप से hyphens में convert हो जाते हैं।

उदाहरण के लिए, अगर आपके code में header parameter save_data है, तो अपेक्षित HTTP header save-data होगा, और docs में भी वह इसी तरह दिखाई देगा।

अगर किसी कारण से आपको इस automatic conversion को disable करना है, तो आप header parameters के लिए Pydantic models में भी ऐसा कर सकते हैं।

from typing import Annotated

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class CommonHeaders(BaseModel):
    host: str
    save_data: bool
    if_modified_since: str | None = None
    traceparent: str | None = None
    x_tag: list[str] = []


@app.get("/items/")
async def read_items(
    headers: Annotated[CommonHeaders, Header(convert_underscores=False)],
):
    return headers
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class CommonHeaders(BaseModel):
    host: str
    save_data: bool
    if_modified_since: str | None = None
    traceparent: str | None = None
    x_tag: list[str] = []


@app.get("/items/")
async def read_items(headers: CommonHeaders = Header(convert_underscores=False)):
    return headers

चेतावनी

convert_underscores को False पर set करने से पहले, ध्यान रखें कि कुछ HTTP proxies और servers underscores वाले headers के उपयोग की अनुमति नहीं देते।

Parameter Models को संयोजित करें

आप कई header parameter models को अलग-अलग header parameters और dependencies के साथ संयोजित कर सकते हैं। हर model को स्वतंत्र रूप से extract और validate किया जाता है, जैसा कि query parameter models के लिए समझाया गया है।

हर model की extra configuration सभी header parameters पर लागू होती है, जिनमें दूसरे models या dependencies में declare किए गए parameters भी शामिल हैं। extra="forbid" के साथ, उस model के बाहर का कोई भी header अस्वीकार कर दिया जाता है। extra="allow" के साथ, वे headers model extras के रूप में शामिल किए जाते हैं।

हर model request पढ़ते समय और OpenAPI generate करते समय अपनी खुद की Header(convert_underscores=...) setting का उपयोग करता है। स्पष्ट रूप से दिए गए field aliases बिना बदलाव के header names बने रहते हैं।

वैकल्पिक Header Parameter Models

पूरे समूह को वैकल्पिक बनाने के लिए header parameter model को | None और None की default value के साथ declare करें।

from typing import Annotated

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class ClientHeaders(BaseModel):
    x_client_name: str
    x_client_version: str


@app.get("/items/")
async def read_items(client: Annotated[ClientHeaders | None, Header()] = None):
    return client
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class ClientHeaders(BaseModel):
    x_client_name: str
    x_client_version: str


@app.get("/items/")
async def read_items(client: ClientHeaders | None = Header(default=None)):
    return client

अगर न तो x-client-name और न ही x-client-version भेजा जाता है, तो client की value None होती है। अगर इनमें से कोई भी भेजा जाता है, तो FastAPI model को validate करता है और दोनों fields को required मानता है।

Defaults, extra fields और OpenAPI के लिए वही नियम लागू होते हैं जो वैकल्पिक query parameter models के लिए हैं।

Host जैसे headers भी model की extra configuration का पालन करते हैं। extra="allow" के साथ, उनकी वजह से model मौजूद माना जाता है, भले ही declare किए गए दोनों fields में से कोई भी न दिया गया हो।

सारांश

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