दस्तावेज़हैंडलर और त्रुटियाँ
त्रुटि पृष्ठ
एक अनुरोध जो विफल हो जाता है उसे अभी भी आपकी साइट के बाकी हिस्सों की तरह उत्तर देना चाहिए: एक विज़िटर के लिए आपके अपने शब्दों में एक पृष्ठ, एक एपीआई क्लाइंट के लिए JSON के समान विफलता। नेक्सी दोनों का उत्तर देती है, और एक फ़ाइल प्रत्येक उत्तर को प्रतिस्थापित कर देती है।
यह पृष्ठ मानचित्र है: कौन सी फ़ाइल किस स्थिति का उत्तर देती है, और अपना पहला कैसे बनाएं। किसी फ़ोल्डर के पेजों को उनका अपना पेज मिलता है।
एक असफलता, दो उत्तर
a request that fails
│
├── a browser (Accept: text/html) ──► an HTML page
└── an API client (Accept: application/json) ──► {"detail": "…"} with the same status
the HTML page
├── the deepest folder of the URL that holds a file ──► your file
└── no folder of the chain holds one ──► the built-in pageआपका पहला पेज
src/routes/notfound.nexy बनाएं और लिखें कि एक आगंतुक को क्या पढ़ना चाहिए:
metadata = {"title": "Page not found"}<h1>Page not found</h1><p>The page moved or never existed. <a href="/">Back home</a>.</p>सहेजें, और एक यूआरएल मांगें जो कुछ भी काम नहीं करता:
curl -i -H "Accept: text/html" http://localhost:3000/nowhere# HTTP/1.1 404 Not Found
रूट रूट पर फ़ाइल पूरे प्रोजेक्ट का उत्तर देती है; किसी फ़ोल्डर में एक प्रतिलिपि केवल उस फ़ोल्डर का उत्तर देती है और बाकी को वैसे ही रखती है। बिना किसी फ़ाइल के, नेक्सी अपने अंतर्निर्मित स्टाइल पेज पर कार्य करता है।
कौन सी फ़ाइल उत्तर देती है
| फ़ाइल | उत्तर |
|---|---|
notfound.nexy |
404 इसकी निर्देशिका के लिए |
errors.nexy |
500 इसकी निर्देशिका के लिए |
forbidden.nexy |
403 इसकी निर्देशिका के लिए |
unauthorized.nexy |
401 इसकी निर्देशिका के लिए |
loading.nexy |
आरक्षित; अभी तक कोई रनटाइम प्रभाव नहीं है |
| स्थिति | उत्तर |
|---|---|
| कोई मार्ग मेल नहीं खाता | 404 |
| एक गतिशील खंड को उसके एनोटेशन में परिवर्तित नहीं किया जा सकता है | 404 |
| किसी पेज या एपीआई हैंडलर में एक हैंडल न किया गया अपवाद | 500 |
raise HTTPException(status_code=403) |
आपके द्वारा उठाया गया स्टेटस, HTML या JSON के रूप में |
notFound(), forbidden(), unauthorized() |
404, 403, 401, अनुरोध में कहीं से भी |
redirect(), permanentRedirect() |
बिना किसी त्रुटि वाले पेज वाला एक वास्तविक रीडायरेक्ट |
एक पेज छोड़ें या कोड से उत्तर दें
redirect, permanentRedirect, notFound, forbidden और unauthorized एक HTTP अपवाद उठाते हैं, इसलिए एक ही कॉल .nexy पेज, एक एपीआई हैंडलर, एक मॉड्यूलर नियंत्रक, एक गार्ड और एक dependencies.py में काम करता है। क्लाइंट पर उनके नाम समान हैं (@nexy/client)।
from nexy import notFound, redirect from src.posts import find slug: prop[str]post = find(slug)if post is None: notFound()if post.moved_to: redirect(post.moved_to)<h1>{{ post.title }}</h1>| बुलाओ | उत्तर |
|---|---|
redirect(url) |
307; redirect(url, status=303) एक फॉर्म के बाद एक POST को GET में बदल देता है |
permanentRedirect(url) |
308; ब्राउज़र और खोज इंजन इसे याद रखते हैं |
notFound(detail=None) |
404: notfound पेज, या एपीआई क्लाइंट के लिए JSON |
forbidden(detail=None) |
403: आगंतुक को पता है लेकिन हो सकता है कि वह इसे न देखे |
unauthorized(detail=None, scheme=None) |
401; scheme="Bearer" जोड़ता है WWW-Authenticate |
एक रीडायरेक्ट उत्तर Location हेडर और बिना किसी पेज के, एक एपीआई क्लाइंट को भी देता है। गंतव्य का निर्माण उन मूल्यों से करें जिन पर आप भरोसा करते हैं: एक redirect(request.query_params["next"]) जहां भी लिंक कहता है वहां आगंतुकों को भेजता है। लाइन ब्रेक वाले गंतव्य को अस्वीकार कर दिया जाता है।
एक गार्ड पूरे फ़ोल्डर की सुरक्षा करता है:
from nexy import unauthorizedfrom nexy.http import Request def require_login(request: Request) -> None: if not request.session.get("user"): unauthorized(scheme="Bearer") dependencies = [require_login]एचटीएमएल या JSON
कौन पूछता है इसके आधार पर एक ही अपवाद अलग-अलग उत्तर देता है:
- एक ब्राउज़र (
Accept: text/html) को एक HTML पेज मिलता है। विवरण HTML से बच गया है, इसलिए उपयोगकर्ता इनपुट से निर्मित संदेश मार्कअप इंजेक्ट नहीं कर सकता है। - एक क्लाइंट जो JSON मांगता है न कि किसी पेज (
Accept: application/json) के लिए, उसे समान स्टेटस कोड के साथ{"detail": "..."}मिलता है।
from nexy.http import HTTPException async def GET(id: int): if id > 100: raise HTTPException(status_code=403, detail="Out of range") return {"id": id}curl -H "Accept: application/json" http://localhost:3000/api/items/500# {"detail":"Out of range"}
हैंडल न किए गए अपवाद
एक अपवाद जिसे कुछ भी संभाला नहीं गया है उसे एक बार लॉग किया जाता है, अपवाद के साथ, यह कहां से आया है और इसके आसपास का कोड है, और मोड के अनुसार उत्तर दिया गया है।
nx dev |
nx start |
|
|---|---|---|
| ब्राउज़र | त्रुटि वाला एक पृष्ठ, आपके कोड की पंक्तियाँ जिसने इसे उठाया और पूरा ट्रेसबैक | अंतर्निहित 500 पृष्ठ (या आपका errors.nexy) एक संदर्भ के साथ |
| JSON क्लाइंट | {"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}
संदर्भ आठ वर्णों का है, प्रत्येक विफलता के लिए नया। कोई विज़िटर इसे उद्धृत कर सकता है, और आप इसके लिए लॉग में खोजकर ट्रेसबैक ढूंढ सकते हैं। उत्पादन में न तो अपवाद और न ही कोड विज़िटर तक पहुंचता है। एक कस्टम errors.nexy केवल पृष्ठ को प्रतिस्थापित करता है; लॉग लाइन रहती है.
सत्यापन त्रुटियाँ
प्रत्येक क्लाइंट के लिए एक गुम हेडर, क्वेरी पैरामीटर या बॉडी फ़ील्ड 422 को FastAPI के JSON बॉडी के साथ उत्तर देता है। सत्यापन और त्रुटियाँ देखें।
अगले चरण
- प्रति फ़ोल्डर त्रुटि पृष्ठ: एक फ़ोल्डर में आपका स्वयं का 404, 403 या 401
- गतिशील मार्ग
- एपीआई मार्ग
- परीक्षण