دستاویزاتہینڈلر اور غلطیاں
خرابی والے صفحات
ایک درخواست جو ناکام ہو جاتی ہے اسے اب بھی آپ کی باقی سائٹ کی طرح جواب دینا چاہیے: ایک وزیٹر کے لیے آپ کے اپنے الفاظ میں ایک صفحہ، API کلائنٹ کے لیے JSON جیسی ناکامی۔ Nexy دونوں کا جواب دیتا ہے، اور ایک فائل ہر جواب کی جگہ لے لیتی ہے۔
یہ صفحہ نقشہ ہے: کون سی فائل جواب دیتی ہے کہ کون سی حیثیت ہے، اور اپنا پہلا صفحہ کیسے بنانا ہے۔ فولڈر کے صفحات کو اپنا صفحہ ملتا ہے۔
ایک ناکامی، دو جواب
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
روٹس روٹ پر موجود فائل پورے پروجیکٹ کا جواب دیتی ہے۔ ایک فولڈر میں ایک کاپی صرف اس فولڈر کا جواب دیتی ہے اور باقی کو اسی طرح رکھتی ہے۔ بغیر کسی فائل کے، Nexy اپنے بلٹ ان اسٹائل والے صفحے کو پیش کرتا ہے۔
جو فائل جواب دیتی ہے۔
| فائل | جوابات |
|---|---|
notfound.nexy |
404 اس کی ڈائریکٹری کے لیے |
errors.nexy |
اس کی ڈائریکٹری کے لیے 500 |
forbidden.nexy |
اس کی ڈائرکٹری کے لیے 403 |
unauthorized.nexy |
401 اس کی ڈائریکٹری کے لیے |
loading.nexy |
محفوظ ابھی تک کوئی رن ٹائم اثر نہیں ہے۔ |
| صورتحال | جواب دیں۔ |
|---|---|
| کوئی راستہ مماثل نہیں ہے۔ | 404 |
| ایک متحرک طبقہ کو اس کی تشریح میں تبدیل نہیں کیا جا سکتا | 404 |
| صفحہ یا API ہینڈلر میں ایک غیر ہینڈل شدہ استثناء | 500 |
raise HTTPException(status_code=403) |
HTML یا JSON کے بطور آپ نے جو اسٹیٹس اٹھایا ہے۔ |
notFound()، forbidden()، unauthorized() |
404، 403، 401، درخواست میں کہیں سے بھی |
redirect()، permanentRedirect() |
ایک حقیقی ری ڈائریکٹ جس میں کوئی خامی صفحہ نہیں ہے۔ |
ایک صفحہ چھوڑیں یا کوڈ سے جواب دیں۔
redirect، permanentRedirect، notFound، forbidden اور unauthorized ایک HTTP استثنیٰ کو بڑھاتے ہیں، لہذا وہی کال ایک .nexy صفحہ، ایک API ہینڈلر، ایک ماڈیولر کنٹرولر، ایک گارڈ اور 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) فارم کے بعد پوسٹ کو GET میں بدل دیتا ہے۔ |
permanentRedirect(url) |
308؛ براؤزر اور سرچ انجن اسے یاد رکھتے ہیں۔ |
notFound(detail=None) |
404: ایک API کلائنٹ کے لیے notfound صفحہ، یا JSON |
forbidden(detail=None) |
403: آنے والا معلوم ہے لیکن اسے نظر نہیں آتا |
unauthorized(detail=None, scheme=None) |
401؛ scheme="Bearer" شامل کرتا ہے WWW-Authenticate |
ایک API کلائنٹ کو بھی Location ہیڈر اور بغیر صفحہ کے جوابات کو ری ڈائریکٹ کرتا ہے۔ ان اقدار سے منزل کی تعمیر کریں جن پر آپ بھروسہ کرتے ہیں: a 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]HTML یا 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 صرف صفحہ کی جگہ لے لیتا ہے۔ لاگ لائن رہتی ہے.
توثیق کی غلطیاں
ایک غائب ہیڈر، استفسار پیرامیٹر یا باڈی فیلڈ ہر کلائنٹ کے لیے FastAPI کے JSON باڈی کے ساتھ 422 جواب دیتا ہے۔ دیکھیں تصدیق اور غلطیاں۔
اگلے اقدامات
- خامی کے صفحات فی فولڈر: ایک فولڈر میں آپ کا اپنا 404، 403 یا 401
- متحرک راستے
- API راستے
- جانچ