विषय पर बढ़ें

Query Parameter Models

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

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

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

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

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

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

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

नोट

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

Pydantic Model के साथ Query Parameters

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

from typing import Annotated, Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class FilterParams(BaseModel):
    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: Annotated[FilterParams, Query()]):
    return filter_query
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from typing import Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class FilterParams(BaseModel):
    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: FilterParams = Query()):
    return filter_query

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

Docs देखें

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

Extra Query Parameters को Forbid करें

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

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

from typing import Annotated, Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


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

    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: Annotated[FilterParams, Query()]):
    return filter_query
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from typing import Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


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

    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: FilterParams = Query()):
    return filter_query

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

उदाहरण के लिए, अगर client plumbus value के साथ tool query parameter भेजने की कोशिश करता है, जैसे:

https://example.com/items/?limit=10&tool=plumbus

उसे एक error response मिलेगा जो बताएगा कि query parameter tool allowed नहीं है:

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

सारांश

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

सुझाव

Spoiler alert: आप cookies और headers declare करने के लिए भी Pydantic models का उपयोग कर सकते हैं, लेकिन आप इसके बारे में tutorial में बाद में पढ़ेंगे। 🤫