यह लगभग तीन सप्ताह पहले सामने आया, यह फास्टएपीआई की सबसे अपेक्षित सुविधाओं में से एक है। कम से कम जब हम पाइडेंटिक मॉडल फास्टएपीआई के बारे में बात कर रहे हैं।
हां, मैं आपके क्वेरी पैरामीटर को मैप करने के लिए पाइडेंटिक मॉडल का उपयोग करने की क्षमता के बारे में बात कर रहा हूं।
तो इस पोस्ट में, मैं आपको वह सब दिखाने की कोशिश करूंगा? कर सकते हैं और? इस विषय पर कुछ नहीं कर सकते?:
पाइडेंटिक के साथ अपने क्वेरी पैरामीटर्स को मैप करना शुरू करने के लिए आपको सबसे पहले यह सुनिश्चित करना होगा कि आप फास्टएपीआई संस्करण 0.115.0 का उपयोग कर रहे हैं।
इसके बाद, आप हमेशा फास्टएपीआई डॉक्स पर जाकर देख सकते हैं कि क्या पहले से उपलब्ध है। सेबस्टियन और टीम के सदस्य दस्तावेज़ों को अद्यतन और जानकारीपूर्ण बनाए रखने पर वास्तव में बहुत अच्छा काम करते हैं ✨।
आइए कुछ उदाहरणों से शुरू करें कि हम फास्टएपीआई में क्वेरी पैरामीटर्स को कैसे मैप करते थे। ?
ऐसा करने का सबसे सरल तरीका होगा:
from fastapi import FastAPI app = FastAPI() @app.get("/") async def search( limit: int | None = 10, skip: int | None = 1, filter: str | None = None ): return { "limit": limit, "skip": skip, "filter": filter }
और अब आप बस कॉल कर सकते हैं:
GET http://localhost:8000/?limit=42&skip=12&filter=banana
लेकिन अगर हमने पहचान लिया कि इस क्वेरी पैरामीटर का उपयोग अन्य मार्गों में किया जाएगा, तो हम इसे कुछ इस तरह से अलग कर देंगे:
from typing import Any from fastapi import Depends, FastAPI, Query app = FastAPI() async def pagination_query_string( limit: int | None = Query(10, ge=5, le=100), skip: int | None = Query(1, ge=1), filter: str | None = Query(None) ) -> dict[str, Any]: return { "limit": limit, "skip": skip, "filter": filter } @app.get("/") async def search(q: dict[str, Any] = Depends(pagination_query_string)): return q
या चूंकि हम अपने मॉडलों को मैप करने के लिए पाइडेंटिक का उपयोग कर रहे हैं, बस थोड़ी सी रीफैक्टरिंग के साथ हमें यह मिलेगा:
from fastapi import Depends, FastAPI, Query from pydantic import BaseModel app = FastAPI() class PaginationQueryString(BaseModel): limit: int | None = 10 skip: int | None = 1 filter: str | None = None async def pagination_query_string( limit: int | None = Query(10, ge=5, le=100), skip: int | None = Query(1, ge=1), filter: str | None = Query(None) ) -> PaginationQueryString: return PaginationQueryString( limit=limit, skip=skip, filter=filter ) @app.get("/") async def search(q: PaginationQueryString = Depends(pagination_query_string)): return q
अब, यदि हम अपनी क्वेरी स्ट्रिंग प्राप्त करना चाहते हैं, तो हमें कोई फ़ंक्शन बनाने और फिर इसे निर्भरता के रूप में जोड़ने की आवश्यकता नहीं है। हम बस फास्टएपीआई को बता सकते हैं कि हमें PaginationQueryString प्रकार का एक ऑब्जेक्ट चाहिए और यह एक क्वेरी स्ट्रिंग है:
from typing import Annotated from fastapi import FastAPI, Query from pydantic import BaseModel app = FastAPI() class PaginationQueryString(BaseModel): limit: int | None = 10 skip: int | None = 1 filter: str | None = None @app.get("/") async def search(q: Annotated[PaginationQueryString, Query()]): return q
आसान, है ना? ?
कम से कम संस्करण 0.115.0 पर, यह नेस्टेड मॉडलों के साथ बहुत अच्छी तरह से काम नहीं करता है।
आइए कुछ ऐसा प्रयास करें:
from typing import Annotated from fastapi import FastAPI, Query from pydantic import BaseModel app = FastAPI() class Filter(BaseModel): name: str | None = None age: int | None = None nickname: str | None = None class PaginationQueryString(BaseModel): limit: int | None = 10 skip: int | None = 1 filter: Filter | None = None @app.get("/") async def search(q: Annotated[PaginationQueryString, Query()]): return q
अगर हम इसे पहले की तरह कहें:
GET http://localhost:8000/?limit=42&skip=12&filter=chocolate
हमें यह बताने में त्रुटि मिलेगी कि फ़िल्टर एक ऑब्जेक्ट है:
{ "detail": [ { "type": "model_attributes_type", "loc": [ "query", "filter" ], "msg": "Input should be a valid dictionary or object to extract fields from", "input": "chocolate" } ] }
कम से कम अभी, यह बिल्कुल सही है! हमने अपने फ़िल्टर को एक पाइडेंटिक मॉडल के रूप में बदल दिया, न कि एक स्ट्रिंग के रूप में। लेकिन अगर हम इसे एक शब्दकोश में बदलने का प्रयास करें:
http://localhost:8000/?limit=42&skip=12&filter={"name": "Rafael", "age": 38, "nickname": "ceb10n"}
FastAPI हमें बताएगा कि फ़िल्टर को एक वैध शब्दकोश होना चाहिए?:
{ "detail": [ { "type": "model_attributes_type", "loc": [ "query", "filter" ], "msg": "Input should be a valid dictionary or object to extract fields from", "input": "{\"name\": \"Rafael\", \"age\": 38, \"nickname\": \"ceb10n\"}" } ] }
ऐसा इसलिए हो रहा है क्योंकि फास्टएपीआई स्टारलेट के क्वेरीपैराम्स पर निर्भर करेगा, जो फास्टएपीआई को एक स्ट्रिंग देगा, कोई निर्देश नहीं। और कम से कम संस्करण 0.115.0 में, यह आपको एक त्रुटि देगा।
यह काफी सरल है:
✅ आपके पास सरल क्वेरी स्ट्रिंग हैं जिनके लिए किसी विस्तृत फैंसी नेस्टेड ऑब्जेक्ट की आवश्यकता नहीं है? इसका इस्तेमाल करें! ?
❌ आपने एक जटिल नेस्टेड क्वेरी स्ट्रिंग बनाई है? अभी तक इसका उपयोग न करें? (और शायद आपको अपनी क्वेरी स्ट्रिंग्स पर पुनर्विचार करने का प्रयास करना चाहिए।? जितना सरल, उतना बेहतर?)
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3