दस्तावेज़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 और एक कार्रवाई में काम करती है।

src/routes/posts/[slug].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 post
src/apps/posts/posts_by_slug_controller.py
from 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 द्वारा मान्य किया जाता है।

src/routes/api/search.py
from nexy.http import Header  async def GET(q: str, limit: int = 10, x_token: str = Header(...)):    return {"q": q, "limit": limit}
src/apps/search/search_api_controller.py
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 भी भरता है। क्रियाएँ देखें।

कस्टम त्रुटि पृष्ठ

src/routes/notfound.nexy
<h1>Page not found</h1><p>The link may be old. <a href="/">Start from the home page</a>.</p>
src/routes/errors.nexy
<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 उत्तर देती है, एक विफलता त्रुटि पृष्ठ दिखाती है। क्रियाएँ देखें।

जब कोई पृष्ठ गलत उत्तर देता है तो एक चेकलिस्ट

  1. स्थिति देखें, पृष्ठ नहीं। एक प्रथा notfound.nexy अभी भी 404 का उत्तर देती है।
  2. टर्मिनल पढ़ें। जो पृष्ठ आयात करने में विफल रहता है वह पंजीकृत नहीं होता है, इसलिए फ़ाइल मौजूद होने पर इसका यूआरएल 404 उत्तर देता है। आयात त्रुटि लॉग में है.
  3. एक्सटेंशन की जांच करें। useCSR = True के साथ, .nexy पेज सर्वर मोड से संबंधित हैं; ग़लत मोड में कोई पेज रूट नहीं है.
  4. गहराई की जाँच करें। एक notfound.nexy या errors.nexy केवल तभी काम करता है जब रूट कॉपी मौजूद हो।
  5. आपके एपीआई क्लाइंट को प्राप्त होने वाले आकार को देखने के लिए Accept: application/json के साथ JSON मांगें।
  6. जब आप कोई समस्या खोलते हैं या लॉग खोजते हैं तो 500 का संदर्भ उद्धृत करें।

अगले चरण

GitHub पर संपादित करें

Enter परिणाम खोलता है, Esc बंद करता है।