دستاویزاتPython API اور غلطیاں
مستثنیات اور غلطیاں
ایک درخواست چار جگہوں پر ناکام ہو سکتی ہے، اور Nexy ہر ایک کو مختلف طریقے سے جواب دیتا ہے۔ یہ صفحہ انڈیکس ہے: وہ اسٹیٹس تلاش کریں جو آپ دیکھتے ہیں، پھر وہ لائن جس نے اسے بنایا، پھر وہ فائل جو باڈی کا فیصلہ کرتی ہے۔
مختصر ورژن
| کیا ہوا؟ | حیثیت | براؤزر دیکھتا ہے۔ | API کلائنٹ دیکھتا ہے۔ |
|---|---|---|---|
| کوئی راستہ URL سے مماثل نہیں ہے۔ | 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 |
منزل، کوئی صفحہ نہیں۔ | منزل |
ایک API کلائنٹ ایک درخواست ہے جس کی 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، CORS، سیشنز |
استثناء کی حیثیت، ورنہ 500 |
| راؤٹر | URL کسی فائل سے میل نہیں کھاتا | 404 |
| توثیق | راستے کے حصے کو تبدیل نہیں کیا جا سکتا | 404 |
| توثیق | ایک سوال، ہیڈر، کوکی یا باڈی فیلڈ | 422 |
| صفحہ، ہینڈلر، عمل، محافظ | HTTPException |
اس کی حیثیت |
| صفحہ، ہینڈلر، عمل، محافظ | کچھ اور | 500 |
کہیں سے بھی چلے جائیں۔
redirect، permanentRedirect، notFound، forbidden اور unauthorized ایک HTTP استثنیٰ کو بڑھاتے ہیں، لہذا وہی کال ایک .nexy صفحہ، ایک API ہینڈلر، ایک ماڈیولر کنٹرولر، ایک گارڈ، ایک 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 کی معیاری شکل ہے، لہذا کلائنٹ اور تیار کردہ SDKs کام کرتے رہتے ہیں:
{"detail": [{"loc": ["query", "q"], "msg": "Field required", "type": "missing"}]}
کسی فارم یا ایکشن کے لیے، کلائنٹ کو status اور detail کے ساتھ ایک ActionError ملتا ہے؛ a 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، بصورت دیگر بلٹ ان صفحہ، حوالہ کے ساتھ |
| API کلائنٹ | {"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۔ - پڑھیں ٹرمینل ایک صفحہ جو درآمد کرنے میں ناکام ہوتا ہے وہ رجسٹرڈ نہیں ہوتا، اس لیے اس کا URL جواب دیتا ہے
404جب کہ فائل موجود ہے۔ درآمد کی خرابی لاگ میں ہے۔ - چیک کریں۔ توسیع
useCSR = Trueکے ساتھ،.nexyصفحات کا تعلق سرور موڈ سے ہے۔ غلط موڈ میں ایک صفحہ ایک راستہ نہیں ہے. - چیک کریں۔ گہرائی A
notfound.nexyیاerrors.nexyصرف اس وقت کام کرتا ہے جب روٹ کاپی موجود ہو۔ - آپ کے API کلائنٹ کو موصول ہونے والی شکل دیکھنے کے لیے
Accept: application/jsonکے ساتھ JSON کے لیے پوچھیں۔ - جب آپ کوئی مسئلہ کھولتے ہیں یا لاگ کو تلاش کرتے ہیں تو
500کا حوالہ دیں۔
اگلے اقدامات
- خرابی کے صفحات: پورے صفحے کا برتاؤ، مثالوں کے ساتھ
- توثیق اور غلطیاں: API ہینڈلرز
- ٹربل شوٹنگ: وہ غلطیاں جو لوگ اصل میں مارتے ہیں۔
- ٹیسٹنگ : ایک حیثیت اور جسم پر زور دیں۔