الوثائقPython واجهة برمجة التطبيقات والأخطاء
الاستثناءات والأخطاء
يمكن أن يفشل الطلب في أربعة أماكن، ويجيب 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، لذلك يستمر العملاء ومجموعات SDK التي تم إنشاؤها في العمل:
{"detail": [{"loc": ["query", "q"], "msg": "Field required", "type": "missing"}]}
بالنسبة للنموذج أو الإجراء، يتلقى العميل ActionError مع status و detail؛ يقوم 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. يحصل عنوان 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 على العودة إلى الصفحة، فشل يظهر صفحة الخطأ. انظر الإجراءات.
قائمة مرجعية عندما تجيب الصفحة على شيء خاطئ
- انظر إلى الحالة، وليس الصفحة. مخصص
notfound.nexyلا يزال يجيب404. - اقرأ الوحدة الطرفية. الصفحة التي يفشل استيرادها لا يتم تسجيلها، لذلك يجيب عنوان URL الخاص بها
404أثناء وجود الملف. خطأ الاستيراد موجود في السجل. - تحقق من الامتداد. مع
useCSR = True، تنتمي الصفحات.nexyإلى وضع الخادم؛ الصفحة في الوضع الخاطئ ليست طريقا. - تحقق من العمق. يعمل
notfound.nexyأوerrors.nexyفقط عند وجود النسخة الجذرية. - اطلب JSON مع
Accept: application/jsonلمعرفة الشكل الذي يتلقاه عميل API الخاص بك. - اقتبس المرجع من
500عندما تفتح مشكلة أو تبحث في السجل.
الخطوات التالية
- صفحات الخطأ: سلوك الصفحة بالكامل مع الأمثلة
- التحقق من الصحة والأخطاء: معالجات API
- استكشاف الأخطاء وإصلاحها: الأخطاء التي وقع فيها الأشخاص بالفعل
- اختبار: تأكيد الحالة والجسم