FastAPI / الأساسي: HTTP والحدود ذات الأنواع / الدرس 1
ASGI وHTTP واختيار المسار
افهم ما تصرح به FastAPI وما يوفره خادم ASGI وكيف يتحقق عميل داخلي من عقد HTTP.
في هذه الصفحة
أهداف الدرس
- اشرح افتراضات وحدود موضوع «ASGI وHTTP واختيار المسار».
- فسر المثالين الكاملين وعلل المخرجات الملاحظة.
- شخص الإخفاقات وطبق الحلول المشروحة مع وضوح ملكية الهوية والحالة ودورة الحياة.
فصل التطبيق وعملية التقديم
تبني FastAPI تطبيق ASGI يستقبل أحداث البروتوكول ويرد، ويوفر الخادم المقابس والعمليات والنقل. لا يبدأ تعريف app خادما. تستخدم الدورة TestClient أونقل ASGI بالذاكرة دون منفذ، فلا تثبت TLS أوالوكيل أوالعمال أوالشبكة. افصل مسؤولية النشر وعقد Python ولا توجه عميل التعليم لمشروع أوخدمة خارجية.
قراءة الطريقة والمسار والحالة والجسم معا
تختار العملية بالطريقة والمسار ولها حالة وترويسات وتمثيل. تسترجع GET حسب العقد ولكل طريقة سلوك. يعيد الغائب 404 وقد يعيد المعروف بطريقة خاطئة 405. يفحص المثال النجاح وJSON والغائب؛ فاختبر الحد لا إرجاع القاموس من الدالة فقط.
from fastapi import FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
@app.get("/health")
def health():
return {"ok": True}
with TestClient(app) as client:
response = client.get("/health")
print(response.status_code, response.json())
print(client.get("/missing").status_code)
200 {'ok': True}
404
يعيد التطبيق 200 وقيمة منطقية، والغائب 404. يستدعي العميل التطبيق داخليا دون منفذ.
معاملة ترتيب المسارات جزءا من العقد
تؤثر أولوية التصريح عند تداخل الأنماط؛ فيسبق latest الثابت المتغير كي لا يلتقطه ويفشل العدد. يختبر المثال الترتيب والحالتين. وضح الاسم والنوع وراجع التوسيع، ولا تعتمد على فشل تحقق عرضي لمنع اختيار معالج حساس.
from fastapi import FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
@app.get("/items/latest")
def latest(): return {"id": "latest"}
@app.get("/items/{item_id}")
def item(item_id: int): return {"id": item_id}
with TestClient(app) as client:
print(client.get("/items/latest").json()["id"], client.get("/items/7").json()["id"])
print(client.post("/items/latest").status_code)
latest 7
405
يختار الثابت قبل العددي، وتعيد POST غير المدعومة 405 دون تعريف تعديل.
استخدام أنواع Python بتوقع صحيح
توضح الأنواع النية ولا تتحقق كل استدعاءات Python تلقائيا. تفحص FastAPI التصريح لاستخراج المدخلات ومخططها وتوفر Pydantic التحقق والتسلسل. هذا حد إطار لا ضمان كل مساعد. وضح شروط دوال العمل واختبرها مستقلة وافصل خطأ النقل عن غياب المورد أومنع العملية.
تشغيل الأساس التعليمي المثبت
تختبر الأمثلة على Python 3.12.3 وFastAPI 0.162.0 وPydantic 2.14.1 وStarlette 0.52.1 وHTTPX 0.28.1 وAnyIO 4.15.1 كأساس متوافق لا أحدث دائم. احفظ الملف الكامل وشغله بعزلة بهذه الاعتماديات واستخدم سياق TestClient للحياة. لا يبدأ خادم أومقبس أوقاعدة مهيأة أواعتماد أوسحابة. راجع الوثائق قبل تغيير الإصدار لتطور التحقق والحياة والعميل.
الأخطاء الشائعة وإصلاحها
تعيد كلمة محجوزة 422
- لماذا يحدث؟
- التقطها المتغير قبل الثابت.
- كيف تصلحه؟
- قدم الثابت المحدد.
- كيف تتجنب تكراره؟
- اختبر المحجوز والعادي.
يعد إرجاع قاموس اختبار HTTP كاملا
- لماذا يحدث؟
- لم تختبر الحالة والتوجيه والتسلسل.
- كيف تصلحه؟
- استخدم عميلا معزولا وافحص العقد.
- كيف تتجنب تكراره؟
- افصل اختبارات العمل والنقل.
يفترض أن الاستيراد يبدأ خادما
- لماذا يحدث؟
- اختلط التطبيق والخادم.
- كيف تصلحه؟
- افصل الاستضافة والنقل.
- كيف تتجنب تكراره؟
- وضح التنفيذ الداخلي.
اختبر فهمك
1. تتلقى GET معروفة POST. ما الفرق عن مسار مجهول؟
اعرض الحل المشروح
تعيد غير المدعومة 405 والمجهولة 404. اختبرهما ولا تعد كل فشل بيانات غائبة؛ فالتوجيه يسبق البحث.
2. لماذا يختلف int على مساعد عن معامل مسار؟
اعرض الحل المشروح
لا تفرض Python النوع تلقائيا، وتستخرج FastAPI المسار وتتحقق عند الحد. اختبر الشرط والطلب مستقلين لا تنقل الضمان للطبقة الخطأ.
أهم ما تعلمته
- تبني FastAPI تطبيق ASGI يستقبل أحداث البروتوكول ويرد، ويوفر الخادم المقابس والعمليات والنقل.
- تؤثر أولوية التصريح عند تداخل الأنماط؛ فيسبق latest الثابت المتغير كي لا يلتقطه ويفشل العدد.
- تختبر الأمثلة على Python 3.12.3 وFastAPI 0.162.0 وPydantic 2.14.1 وStarlette 0.52.1 وHTTPX 0.28.1 وAnyIO 4.15.1 كأساس متوافق لا أحدث دائم.