دستاویزات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 اور ایک کارروائی میں کام کرتی ہے۔

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 کی معیاری شکل ہے، لہذا کلائنٹ اور تیار کردہ SDKs کام کرتے رہتے ہیں:

{"detail": [{"loc": ["query", "q"], "msg": "Field required", "type": "missing"}]}

کسی فارم یا ایکشن کے لیے، کلائنٹ کو status اور detail کے ساتھ ایک ActionError ملتا ہے؛ a 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، بصورت دیگر بلٹ ان صفحہ، حوالہ کے ساتھ
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 جواب دیتی ہے، ناکامی غلطی کا صفحہ دکھاتی ہے۔ دیکھیں اعمال۔

ایک چیک لسٹ جب ایک صفحہ غلط چیز کا جواب دیتا ہے۔

  1. حالت دیکھو صفحہ کو نہیں۔ ایک رواج notfound.nexy اب بھی جواب دیتا ہے 404۔
  2. پڑھیں ٹرمینل ایک صفحہ جو درآمد کرنے میں ناکام ہوتا ہے وہ رجسٹرڈ نہیں ہوتا، اس لیے اس کا URL جواب دیتا ہے 404 جب کہ فائل موجود ہے۔ درآمد کی خرابی لاگ میں ہے۔
  3. چیک کریں۔ توسیع useCSR = True کے ساتھ، .nexy صفحات کا تعلق سرور موڈ سے ہے۔ غلط موڈ میں ایک صفحہ ایک راستہ نہیں ہے.
  4. چیک کریں۔ گہرائی A notfound.nexy یا errors.nexy صرف اس وقت کام کرتا ہے جب روٹ کاپی موجود ہو۔
  5. آپ کے API کلائنٹ کو موصول ہونے والی شکل دیکھنے کے لیے Accept: application/json کے ساتھ JSON کے لیے پوچھیں۔
  6. جب آپ کوئی مسئلہ کھولتے ہیں یا لاگ کو تلاش کرتے ہیں تو 500 کا حوالہ دیں۔

اگلے اقدامات

GitHub پر ترمیم کریں

Enter نتیجہ کھولتا ہے، Esc بند کرتا ہے۔