दस्तावेज़Python एपीआई और त्रुटियां
अपवाद और त्रुटियाँ
एक अनुरोध चार स्थानों पर विफल हो सकता है, और नेक्सी प्रत्येक का अलग-अलग उत्तर देता है। यह पृष्ठ अनुक्रमणिका है: जो स्थिति आप देखते हैं उसे ढूंढें, फिर वह पंक्ति जिसने इसे उत्पन्न किया, फिर वह फ़ाइल जो मुख्य भाग का निर्णय करती है।
लघु संस्करण
| क्या हुआ? | स्थिति | ब्राउज़र देखता है | एपीआई क्लाइंट देखता है |
|---|---|---|---|
| कोई भी रूट यूआरएल से मेल नहीं खाता | 404 |
notfound.nexy, अन्यथा अंतर्निहित पृष्ठ |
{"detail": "Not Found"} |
| एक पथ खंड इसके एनोटेशन में फिट नहीं बैठता है | 404 |
वही पेज | {"detail": "Not Found"} |
| कोई क्वेरी, हेडर, कुकी या बॉडी फ़ील्ड गुम या अमान्य है | 422 |
FastAPI की JSON बॉडी | FastAPI की JSON बॉडी |
notFound() |
404 |
पेज | {"detail": ...} |
unauthorized() |
401 |
अंतर्निर्मित पृष्ठ | {"detail": ...} |
forbidden() |
403 |
अंतर्निर्मित पृष्ठ | {"detail": ...} |
raise HTTPException(409, ...) |
409 |
अंतर्निर्मित पृष्ठ | {"detail": ...} |
| अपवाद कुछ भी नहीं पकड़ा गया | 500 |
errors.nexy, अन्यथा अंतर्निहित पृष्ठ |
{"detail", "reference"} |
redirect(url) |
307 |
गंतव्य, कोई पृष्ठ नहीं | मंजिल, कोई शरीर नहीं |
permanentRedirect(url) |
308 |
गंतव्य, कोई पृष्ठ नहीं | गंतव्य |
एपीआई क्लाइंट एक अनुरोध है जिसका Accept हेडर JSON मांगता है न कि कोई पेज:
curl -H "Accept: application/json" http://localhost:3000/api/items/500# {"detail":"Out of range"}
विफलता कहां से आती है
Browser ──► Middleware ──► Router ──► Page or handler
│ │ │
│ │ ├─ return ───────────► 200
│ │ ├─ HTTPException ────► its status
│ │ └─ other exception ───► 500
│ └─ no match ────────────────────────► 404
└─ raises ──────────────────────────────────────► 500| मंच | क्या असफल हो सकता है | उत्तर |
|---|---|---|
| मिडलवेयर | आपके middleware.py, सीओआरएस, सत्र |
अपवाद की स्थिति, अन्यथा 500 |
| राउटर | यूआरएल किसी फ़ाइल से मेल नहीं खाता | 404 |
| मान्यता | पथ खंड को परिवर्तित नहीं किया जा सकता | 404 |
| मान्यता | एक क्वेरी, हेडर, कुकी या बॉडी फ़ील्ड | 422 |
| पेज, हैंडलर, एक्शन, गार्ड | HTTPException |
इसकी स्थिति |
| पेज, हैंडलर, एक्शन, गार्ड | और कुछ भी | 500 |
कहीं से भी निकलें
redirect, permanentRedirect, notFound, forbidden और unauthorized एक HTTP अपवाद बढ़ाते हैं, इसलिए एक ही कॉल .nexy पेज, एक एपीआई हैंडलर, एक मॉड्यूलर नियंत्रक, एक गार्ड, एक dependencies.py और एक कार्रवाई में काम करती है।
from nexy import notFound, redirect from src.posts import find async def GET(slug: str): post = find(slug) if post is None: notFound("No such post") if post.moved_to: redirect(post.moved_to) return postfrom nexy import notFound, redirectfrom nexy.decorators import Controller from src.posts import find @Controller("/posts/{slug}")class PostsBySlugController: async def get(self, slug: str): post = find(slug) if post is None: notFound("No such post") if post.moved_to: redirect(post.moved_to) return postनियंत्रक को रूट मॉड्यूल के controllers में सूचीबद्ध करें।
| बुलाओ | उत्तर | कब |
|---|---|---|
notFound(detail=None) |
404 |
संसाधन मौजूद नहीं है |
unauthorized(detail=None, scheme=None) |
401 |
आगंतुक को पहले साइन इन करना होगा |
forbidden(detail=None) |
403 |
आगंतुक को पता है लेकिन हो सकता है कि वह इसे न देखे |
redirect(url, status=307) |
307 |
विधि रखते हुए उन्हें अन्यत्र भेजें |
redirect(url, status=303) |
303 |
एक फॉर्म के बाद: अगला अनुरोध एक GET है |
permanentRedirect(url) |
308 |
एक स्थानांतरित पृष्ठ जिसे खोज इंजनों को याद रखना चाहिए |
मंजिल का निर्माण उन मूल्यों से करें जिन पर आप भरोसा करते हैं। redirect(request.query_params["next"]) जहां भी लिंक कहा गया है वहां आगंतुकों को भेजता है; यह एक खुला रीडायरेक्ट है. जिस गंतव्य पर लाइन ब्रेक होता है उसे अस्वीकार कर दिया जाता है।
सत्यापन: 422, या 404
हैंडलर पैरामीटर्स को उनके एनोटेशन के विरुद्ध FastAPI द्वारा मान्य किया जाता है।
from nexy.http import Header async def GET(q: str, limit: int = 10, x_token: str = Header(...)): return {"q": q, "limit": limit}from nexy.decorators import Controllerfrom nexy.http import Header @Controller("/api/search")class SearchApiController: async def get(self, q: str, limit: int = 10, x_token: str = Header(...)): return {"q": q, "limit": limit}नियंत्रक को रूट मॉड्यूल के controllers में सूचीबद्ध करें।
| समस्या | स्थिति | क्यों |
|---|---|---|
| गुम या अमान्य क्वेरी, हेडर, कुकी या बॉडी फ़ील्ड | 422 |
अनुरोध हैंडलर तक पहुंच गया, डेटा गलत है |
अमान्य पथ खंड (/api/users/abc के लिए id: int) |
404 |
फ़ोल्डर में गैर-संख्या के लिए कोई मार्ग नहीं है, इसलिए URL मौजूद नहीं है |
422 बॉडी FastAPI का मानक आकार है, इसलिए क्लाइंट और जेनरेट किए गए एसडीके काम करते रहते हैं:
{"detail": [{"loc": ["query", "q"], "msg": "Field required", "type": "missing"}]}
किसी फॉर्म या कार्रवाई के लिए, ग्राहक को ActionError के साथ status और detail प्राप्त होता है; एक 422 प्रति फ़ील्ड एक संदेश के साथ error.fields भी भरता है। क्रियाएँ देखें।
कस्टम त्रुटि पृष्ठ
<h1>Page not found</h1><p>The link may be old. <a href="/">Start from the home page</a>.</p><h1>Something went wrong</h1><p>Try again in a moment.</p>| फ़ाइल | स्थिति | दायरा |
|---|---|---|
src/routes/notfound.nexy |
404 |
परियोजना का हर मार्ग |
src/routes/errors.nexy |
500 |
परियोजना का हर मार्ग |
src/routes/forbidden.nexy |
403 |
परियोजना का हर मार्ग |
src/routes/unauthorized.nexy |
401 |
परियोजना का हर मार्ग |
src/routes/blog/notfound.nexy |
404 |
/blog और नीचे |
src/routes/blog/errors.nexy |
500 |
/blog और नीचे |
src/routes/loading.nexy |
- | आरक्षित, अभी तक कोई रनटाइम प्रभाव नहीं |
मार्गों में कहीं एक फ़ाइल अपनी स्थिति के लिए उत्तर स्थापित करती है: रूट पर एक प्रतिलिपि पूरे प्रोजेक्ट का उत्तर देती है, एक फ़ोल्डर में एक प्रतिलिपि उस फ़ोल्डर का उत्तर देती है, और URL से मेल खाने वाली सबसे गहरी फ़ाइल जीतती है। प्रत्येक प्रतिलिपि के बाहर एक यूआरएल, और बिना किसी फ़ाइल वाली स्थिति, अंतर्निहित स्टाइल वाले पृष्ठ प्राप्त करते हैं। प्रति फ़ोल्डर त्रुटि पृष्ठ देखें।
मॉड्यूलर राउटर की फ़ाइल में कोई त्रुटि पृष्ठ नहीं है: 404, 500, 403 या 401 को अंतर्निहित स्टाइल वाला पृष्ठ मिलता है। प्रति फ़ोल्डर त्रुटि पृष्ठ फ़ाइल-आधारित राउटर का एक सम्मेलन है।
हैंडल न किए गए अपवाद
एक अपवाद यह है कि पकड़ी गई कोई भी चीज़ एक बार लॉग नहीं की जाती है, उसके संदर्भ के साथ, वह कहां से आई है और उसके आसपास का कोड क्या है। स्थिति 500 है, और शरीर पर्यावरण पर निर्भर करता है।
nexy dev |
nexy build फिर nexy start |
|
|---|---|---|
| ब्राउज़र | त्रुटि, आपके कोड की पंक्तियाँ और ट्रेसबैक | errors.nexy, अन्यथा अंतर्निहित पृष्ठ, एक संदर्भ के साथ |
| एपीआई क्लाइंट | {"detail", "reference", "error"} |
{"detail", "reference"} |
| टर्मिनल | अपवाद और आपके कोड की पंक्तियाँ | अपवाद, संपूर्ण ट्रेसबैक और संदर्भ |
x ZeroDivisionError: division by zero GET /boom ref fe6a5217 at src/routes/boom.py:2 in GET 1 | def GET(): 2 | return {"a": 1 / 0}
संदर्भ आठ वर्णों का है, प्रत्येक विफलता के लिए नया। कोई विज़िटर इसे उद्धृत कर सकता है, और आप इसके लिए लॉग में खोजकर ट्रेसबैक ढूंढ सकते हैं। उत्पादन में न तो अपवाद और न ही कोड विज़िटर तक पहुंचता है।
क्रियाएँ और रूप
एक क्रिया एक उत्पन्न पथ के साथ एक POST समापन बिंदु है। इसकी विफलताएँ उन्हीं नियमों का पालन करती हैं:
| स्थिति | स्थिति | ग्राहक |
|---|---|---|
| कोई फ़ील्ड गुम या अमान्य है | 422 |
ActionError के साथ fields |
HTTPException(403) कार्रवाई में उठाया गया |
403 |
ActionError के साथ status और detail |
| एक हैंडल न किया गया अपवाद | 500 |
ActionError; संदर्भ सर्वर लॉग में है |
Origin हेडर एक अन्य साइट है |
403 |
कार्रवाई चलने से पहले मना कर दिया |
कार्रवाई पथ पर JavaScript पोस्ट के बिना एक फॉर्म; एक सफलता पृष्ठ पर वापस 303 उत्तर देती है, एक विफलता त्रुटि पृष्ठ दिखाती है। क्रियाएँ देखें।
जब कोई पृष्ठ गलत उत्तर देता है तो एक चेकलिस्ट
- स्थिति देखें, पृष्ठ नहीं। एक प्रथा
notfound.nexyअभी भी404का उत्तर देती है। - टर्मिनल पढ़ें। जो पृष्ठ आयात करने में विफल रहता है वह पंजीकृत नहीं होता है, इसलिए फ़ाइल मौजूद होने पर इसका यूआरएल
404उत्तर देता है। आयात त्रुटि लॉग में है. - एक्सटेंशन की जांच करें।
useCSR = Trueके साथ,.nexyपेज सर्वर मोड से संबंधित हैं; ग़लत मोड में कोई पेज रूट नहीं है. - गहराई की जाँच करें। एक
notfound.nexyयाerrors.nexyकेवल तभी काम करता है जब रूट कॉपी मौजूद हो। - आपके एपीआई क्लाइंट को प्राप्त होने वाले आकार को देखने के लिए
Accept: application/jsonके साथ JSON मांगें। - जब आप कोई समस्या खोलते हैं या लॉग खोजते हैं तो
500का संदर्भ उद्धृत करें।
अगले चरण
- त्रुटि पृष्ठ: संपूर्ण पृष्ठ व्यवहार, उदाहरण सहित
- सत्यापन और त्रुटियाँ: एपीआई हैंडलर
- समस्या निवारण: वे त्रुटियाँ जो लोग वास्तव में करते हैं
- परीक्षण: एक स्थिति और एक निकाय का दावा करें