FastAPI إطار بايثون حديث لبناء واجهات برمجة التطبيقات بسرعة باستخدام تلميحات النوع، التحقق، ووثائق OpenAPI التلقائية. تعرّف على الأساسيات ومتى تستخدمه.

FastAPI هو إطار بايثون لبناء واجهات الويب بسرعة، مع شفرة واضحة ووثائق تلقائية. تكتب دوال صغيرة (تسمى "نقاط نهاية") تعلن ما البيانات التي يقبلها الـ API وما تعيده، وFastAPI يتولى أعمال الويب — التوجيه، التحقق، وإنتاج استجابات JSON.
الـ API هي مجموعة من عناوين URL التي تسمح لقطعة من البرمجيات بالتحدث إلى أخرى.
على سبيل المثال، قد يستدعي تطبيق طقس على هاتفك عنوانًا مثل GET /weather?city=Berlin. يرد الخادم ببيانات منظمة (عادة JSON)، مثل درجة الحرارة والتوقع. تطبيق الهاتف لا يحتاج وصولًا مباشرًا إلى قاعدة البيانات — يطلب الـ API ويعرض النتيجة.
FastAPI يساعدك على إنشاء تلك العناوين والاستجابات في بايثون.
لا تحتاج لأن تكون خبيرًا في async لتبدأ؛ يمكنك كتابة مسارات بسيطة وتبني أنماط أكثر تقدمًا مع نموك.
انتشر FastAPI بسرعة لأنه يزيل الكثير من الاحتكاك اليومي عند بناء APIs في بايثون.
مشاريع API التقليدية غالبًا ما تبدأ بإعداد بطيء والكثير من "الأعمال التحتية":
ميزات FastAPI الأساسية تستهدف هذه المشاكل مباشرة، لذا تقضي الفرق وقتًا أكثر في تصميم النقاط النهائية ووقتًا أقل في القتال مع زوائد الإطار.
يعتمد FastAPI بشكل كبير على تلميحات النوع في بايثون. عندما تعلن أن الحقل من نوع int أو اختياري أو قائمة من عناصر، يستخدم FastAPI هذه المعلومة للتحقق من المدخلات وتشكيل المخرجات.
هذا يقلل الأخطاء الناتجة عن "التعامل كنصوص" ويشجع سلوكًا موحّدًا لنقاط النهاية. إنها بايثون نفسها، لكن مع توقعات أوضح مضمنة في توقيعات الدوال.
بما أن مخطط الـ API مستمد من الشيفرة، يمكن لـ FastAPI توليد وثائق تفاعلية تلقائيًا (OpenAPI + Swagger UI/ReDoc). هذا مهم للتعاون: مطورو الواجهة الأمامية، فريق الاختبار، والاندماجات يمكنهم استكشاف النقاط النهائية، تجربة الطلبات، ورؤية النماذج الدقيقة دون انتظار جهد توثيق منفصل.
FastAPI لن يصلح تصميم API سيئ. ما زلت بحاجة لتسمية جيدة، إدارة الإصدارات، التعامل مع الأخطاء، وقرارات أمان. ما يقدمه هو مسار أنظف من "فكرة" إلى "API محدد جيدًا" مع مفاجآت أقل على الطريق.
FastAPI يبدو بسيطًا عندما تفهم بعض الأفكار الأساسية التي يبني عليها. لا تحتاج لحفظ التفاصيل الداخلية — فقط تعرف الأجزاء التي ستستخدمها يوميًا.
الإطار هو مجموعة أدوات واتفاقيات لبناء API دون البدء من الصفر. يوفر FastAPI "الأنابيب" للمهام الشائعة: تعريف النقاط النهائية، قراءة المدخلات، إرجاع المخرجات، التعامل مع الأخطاء، وتنظيم الشيفرة بطريقة قابلة للصيانة.
التوجيه يربط عنوان URL وطريقة HTTP بشيفرة بايثون.
على سبيل المثال، قد تربط GET /users بـ "قائمة المستخدمين" و POST /users بـ "إنشاء مستخدم". في FastAPI عادةً ما تعرف المسارات باستخدام ديكوريتورات مثل @app.get(...) و @app.post(...)، مما يجعل من السهل رؤية ما يقدمه الـ API بنظرة سريعة.
كل استدعاء API هو طلب (ما يرسله العميل) واستجابة (ما يعيده الخادم).
يساعدك FastAPI على:
/users/{id})، سلسلة الاستعلام (?page=2)، الرؤوس، وجسم الطلب200, 201, 404)يعمل FastAPI على ASGI، وهو معيار حديث لخوادم الويب في بايثون. عمليًا، هذا يعني أن FastAPI مصمم للتعامل مع اتصالات عديدة بكفاءة، ويمكنه دعم ميزات مثل الاتصالات طويلة الأمد (مثل WebSockets) عندما تحتاجها—دون أن تضطر لإدارة الشبكات منخفضة المستوى بنفسك.
تلميحات النوع في بايثون (مثل str, int, list[Item]) ليست مجرد توثيق في FastAPI — بل هي مدخل أساسي. يستخدمها FastAPI لفهم ما تتوقعه، تحويل القيم الواردة إلى الأنواع الصحيحة، وإنتاج APIs أوضح وأكثر قابلية للتوقع.
تسمح نماذج Pydantic بتعريف شكل البيانات (الحقول، الأنواع، القيم الاختيارية) في مكان واحد. يستخدمها FastAPI للتحقق من JSON الوارد، رفض المدخلات غير الصحيحة مع رسائل خطأ مفيدة، وتسلسل المخرجات بشكلٍ موحّد — لذا يتصرف الـ API بموثوقية حتى عندما يرسل العملاء بيانات غير نظيفة.
تُبنى تطبيقات FastAPI حول نقاط النهاية: مسار URL بالإضافة إلى طريقة HTTP. فكر في نقطة النهاية كـ "ماذا يطلب العميل" و"كيف يطلبه". على سبيل المثال، قد يقوم العميل GET /users لعرض المستخدمين، أو POST /users لإنشاء واحد.
المسار هو الطريق، والطريقة هي الإجراء:
GET /products → جلب بياناتPOST /products → إرسال بيانات لإنشاء شيءPUT /products/123 → استبدال/تحديث شيءDELETE /products/123 → حذف شيءيفصل FastAPI البيانات التي هي جزء من المسار عن البيانات التي تكون عادةً مرشحات اختيارية على الطلب.
GET /users/42 → 42 هو معرف المستخدم.? وعادة ما يكون اختياريًا.
GET /users?limit=10\u0026active=true → limit وactive تتحكمان في كيفية إرجاع النتائج.عندما يرسل العميل بيانات منظمة (عادة JSON)، تذهب في جسم الطلب، غالبًا مع POST أو PUT.
مثال: POST /orders مع JSON مثل { "item_id": 3, "quantity": 2 }.
يمكن أن يعيد FastAPI كائنات بايثون بسيطة (مثل dicts)، لكنه يتألق عندما تعرف نموذج استجابة. ذلك النموذج يعمل كعقد: الحقول مصوغة بشكل متسق، يمكن فلترة البيانات الزائدة، وتطبق الأنواع. النتيجة هي APIs أنظف — العملاء يعرفون ما يتوقعون، وتتجنب مفاجآت في الاستجابات تكسر التكاملات.
"Async" (اختصارًا asynchronous) هو طريقة لتعامل الـ API مع العديد من الطلبات بكفاءة عندما يقضي الكثير من الوقت في الانتظار.
تخيل باريستا يأخذ الطلبات. إذا اضطر لأن يقف دون فعل أي شيء أثناء عمل ماكينة الإسبريسو، فسوف يخدم عددًا أقل من الزبائن. نهج أفضل هو: يبدأ تحضير القهوة، ثم يأخذ الطلب التالي بينما الماكينة تعمل.
الـ async يعمل هكذا. يمكن لتطبيق FastAPI أن يبدأ عملية تنتظر شيئًا بطيئًا — مثل طلب شبكي أو استعلام قاعدة بيانات — وبينما ينتظر، ينتقل لمعالجة طلبات واردة أخرى.
ينجلي دور async عندما يقوم الـ API بالكثير من أعمال I/O (أشياء تقضي وقتًا في الانتظار بدلاً من "التفكير"). أمثلة شائعة:
إذا كانت نقاط النهاية تقضي وقتًا كبيرًا في هذه العمليات، فـ async يمكن أن يحسن الإنتاجية ويقلل احتمال تراكم الطلبات تحت الحمل.
الـ async ليس زر تسريع سحري لكل شيء. إذا كان مسارك يعتمد بشكل أساسي على وحدة المعالجة المركزية — مثل تغيير حجم صور كبيرة، تشغيل حسابات علوم بيانات، أو تشفير حمولات كبيرة — فلن يجعل الـ async الحوسبة نفسها أسرع. في مثل هذه الحالات تحتاج لتكتيكات أخرى (عمال خلفيين، تجمعات عمليات، أو توسيع العدد).
لا تحتاج لإعادة كتابة كل شيء لاستخدام FastAPI. يمكنك كتابة دوال مسارات عادية (sync) وFastAPI سيشغلها بشكل جيد. الكثير من المشاريع تمزج بين النمطين: احتفظ بالمسارات البسيطة متزامنة، واستخدم async def حيث يساعد بوضوح (عادة حول استدعاءات قواعد البيانات أو HTTP خارجية).
التحقق هو نقطة التفتيش بين العالم الخارجي وشيفرتك. عندما يقبل الـ API مدخلات (جسم JSON، معاملات استعلام، معاملات مسار)، تريد التأكد من اكتمالها، وصحة أنواعها، وأنها ضمن حدود معقولة — قبل الكتابة إلى قاعدة بيانات أو استدعاء خدمة أخرى أو تنفيذ منطق الأعمال.
يعتمد FastAPI على Pydantic لهذا. تصف شكل "البيانات الجيدة" مرة واحدة، وFastAPI تلقائيًا:
إذا أرسل العميل شكل بيانات خاطئ، يرد FastAPI بـ 422 Unprocessable Entity وحِزمة خطأ منظمة تشير للحقل المحدد والسبب. هذا يساعد مطوري العملاء على إصلاح الطلبات بسرعة، دون تخمين.
هنا نموذج صغير يوضح الحقول المطلوبة، الأنواع، قيود الحد الأدنى/الحد الأقصى، والصيغ:
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
email: EmailStr
age: int = Field(ge=13, le=120)
username: str = Field(min_length=3, max_length=20)
email موجودًا.age يجب أن يكون عددًا صحيحًا.age مقيد بين 13–120.EmailStr يفرض شكل بريد إلكتروني صالح.يمكن أن تشكل نفس النماذج المخرجات أيضًا، حتى لا يتسرب الحقول الداخلية عن طريق الخطأ. تُرجع كائنات بايثون؛ يقوم FastAPI (عبر Pydantic) بتحويلها إلى JSON مع أسماء الحقول والأنواع الصحيحة.
إحدى ميزات FastAPI العملية هي أنه يولد وثائق API لك تلقائيًا — بناءً على الشيفرة التي كتبتها بالفعل.
OpenAPI معيار لوصف API في صيغة منظمة (عادة JSON). اعتبره "عقدة" توضح:
GET /users/{id})لأنها قابلة للقراءة آليًا، يمكن للأدوات استخدامها لتوليد عملاء اختبار، التحقق من الطلبات، والحفاظ على تآزر الفرق.
يقدّم FastAPI صفحتين توثيقيتين بشريتين تلقائيًا:
في مشروع FastAPI نموذجي، ستجدهما عند:
/docs (Swagger UI)/redoc (ReDoc)عندما تغيّر معاملات المسار، نماذج الطلب، نماذج الاستجابة، أو قواعد التحقق، يتحدث مخطط OpenAPI (صفحات الوثائق) تلقائيًا. لا حاجة لخطوة صيانة وثائق منفصلة.
يمكن أن يكون تطبيق FastAPI صغيرًا ويشعر "حقيقيًا". تعرّف كائن بايثون يسمى app، تضيف بعض المسارات، وتشغّل خادمًا محليًا لتجربته في المتصفح.
ها هو أصغر مثال مفيد:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI"}
هذا كل شيء: مسار واحد (GET /) يعيد JSON.
لنجعل الأمر أشبه بواجهة API، دعونا نخزن العناصر في قائمة. هذا ليس قاعدة بيانات — تُعاد البيانات عند إعادة تشغيل الخادم — لكنه مثالي للتعلم.
from fastapi import FastAPI
app = FastAPI()
items = []
@app.post("/items")
def create_item(name: str):
item = {"id": len(items) + 1, "name": name}
items.append(item)
return item
@app.get("/items")
def list_items():
return items
يمكنك الآن:
POST /items?name=Coffee لإضافة عنصرGET /items لاسترجاع القائمةهيكل بداية شائع:
main.py (يخلق app والمسارات)requirements.txt أو pyproject.toml (التبعيات)عادةً ما:
uvicorn main:app --reload)/ وحاول تجربة النقاط النهائيةتبعيات FastAPI هي المدخلات المشتركة التي تحتاجها نقاط النهاية — أمور مثل جلسة قاعدة بيانات، المستخدم الحالي المسجّل، إعدادات التطبيق، أو معاملات استعلام مشتركة. بدلًا من إنشاء أو تحليل هذه الأشياء في كل مسار، تعرفها مرة ويقوم FastAPI بتوفيرها حيثما احتاجت.
التبعية عادة دالة (أو صف) تعيد قيمة يمكن أن يستخدمها مسارك. يقوم FastAPI باستدعاؤها نيابة عنك، ويعرف ما تحتاجه منها (بناءً على معاملاتها)، ويحقن النتيجة في دالة مسار العملية.
هذا ما يُسمى غالبًا حقن التبعيات، لكن يمكنك التفكير به كـ: "أعلن عما تحتاجه، وFastAPI يربطها لك".
بدونه، قد تقوم بـ:
مع التبعيات، تُركز تلك المنطق في مكان واحد. إذا غيرت لاحقًا كيفية إنشاء جلسة DB أو كيفية تحميل المستخدم الحالي، تعدّل مكانًا واحدًا — لا عشرات المسارات.
page/limit والتحقق منهإليك النمط التصوري الذي سترى في كثير من تطبيقات FastAPI:
from fastapi import Depends, FastAPI
app = FastAPI()
def get_settings():
return {"items_per_page": 20}
@app.get("/items")
def list_items(settings=Depends(get_settings)):
return {"limit": settings["items_per_page"]}
تعلن التبعية بـ Depends(...)، وFastAPI يمرّر نتيجتها إلى معامل دالة المسار. نفس النهج يعمل لبناءات أكثر تعقيدًا (مثل get_db() أو get_current_user())، مما يساعد شيفرتك على البقاء أنظف مع نمو الـ API.
FastAPI لا "يؤمن" الـ API تلقائيًا — تختار المخطط وتربطه في نقاط النهاية. الخبر الجيد أن FastAPI يوفّر لبنات بناء (خاصة عبر نظام التبعيات) تجعل أنماط الأمان الشائعة سهلة التنفيذ.
المصادقة تجيب: "من أنت؟" التفويض يجيب: "ما الذي يُسمح لك بفعلِه؟"
مثال: قد يكون المستخدم مصدقًا (تسجيل دخول/توكن صالح) لكنه غير مخوّل للوصول إلى مسار خاص بالمسؤول.
X-API-Key). ضع سياسة تدوير وإبطال.يدعم FastAPI هذه الأنماط عبر أدوات مثل fastapi.security ويوثقها بوضوح في OpenAPI.
إذا خزنت كلمات مرور المستخدمين، لا تخزنها بنص واضح. خزّن تجزئة مملّحة وبطيئة (مثل bcrypt/argon2 عبر مكتبة موثوقة). فكر أيضًا في حد السرعة وسياسات غلق الحساب.
الأمان يتعلق بالتفاصيل: تخزين الرموز، إعدادات CORS، HTTPS، إدارة الأسرار، وفحوص التفويض الصحيحة على كل مسار حساس. اعتبر الأدوات المدمجة نقطة بداية، وراجع نهجك بواسطة مراجعات واختبارات قبل الاعتماد عليه في الإنتاج.
الاختبار هو المكان الذي يتحول فيه وعد FastAPI بـ"يعمل على جهازي" إلى ثقة يمكنك النشر بها. الخبر الجيد: FastAPI مبني على Starlette، لذا تحصل على أدوات اختبار قوية دون إعداد كبير.
اختبارات الوحدة تركز على قطع صغيرة: دالة تحسب قيمة، تبعية تحمل المستخدم الحالي، أو طريقة خدمة تتحدث إلى قاعدة بيانات (غالبًا مع محاكاة).
اختبارات التكامل تمارس الـ API بشكل كامل: تستدعي نقطة نهاية وتتحقق من الاستجابة HTTP الكاملة. هذه الاختبارات تلتقط أخطاء التوجيه، توصيل التبعيات، ومشكلات التحقق.
مجموعة اختبارات صحية عادةً ما تحتوي على اختبارات وحدة أكثر (سريعة) وعدد أقل من اختبارات التكامل (ثقة أعلى).
يمكن اختبار تطبيقات FastAPI "كالعميل" باستخدام TestClient من Starlette، الذي يرسل طلبات إلى تطبيقك داخل العملية — لا حاجة لخادم خارجي.
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
def test_healthcheck():
r = client.get("/health")
assert r.status_code == 200
اختبر الأمور التي يعتمد عليها المستخدمون والأنظمة الأخرى:
استخدم بيانات متوقعة، عزل الخدمات الخارجية (محاكاة أو استخدام DB اختبارية)، وتجنب الحالة المشتركة بين الاختبارات. الاختبارات السريعة تُشغّل؛ الاختبارات البطيئة تُتجاهل.
وضع تطبيق FastAPI على الإنترنت يتعلق أساسًا باختيار "مشغّل" مناسب وإضافة بعض أساسيات الإنتاج.
عند تشغيل uvicorn main:app --reload محليًا، تستخدم إعدادات تطوير: إعادة تحميل تلقائية، أخطاء مفصلة، وإعدادات تُفضّل الراحة.
في الإنتاج، عادةً ما تشغّل Uvicorn بدون reload، وغالبًا خلف مدير عمليات (مثل Gunicorn مع عمال Uvicorn) أو خلف وكيل عكسي. الهدف هو الاستقرار: إعادة تشغيل منضبطة، أداء متوقع، وإعدادات افتراضية أكثر أمانًا.
نمط شائع:
هذا يجعل قاعدة شيفرة واحدة قابلة للنشر في بيئات متعددة دون تعديل الملفات.
قبل أن تعتبر التطبيق "جاهزًا"، تأكد من وجود:
/health لمراقبة الجاهزية ومتوازنات التحميل.إذا انتقلت من "يعمل محليًا" إلى "قابل للشحن"، يفيد أيضًا توحيد كيفية توليد وإدارة عقدة الـ API. بعض الفرق توفق بين مخرجات OpenAPI في سير العمل الآلي — مثل توليد عملاء، التحقق من الطلبات في CI، والنشر المتسق. أدوات مثل Koder.ai قد تدخل في هذه المرحلة: يمكنك وصف الـ API في محادثة، التجربة السريعة على النقاط والنماذج، ثم تصدير الشيفرة لمراجعة/نشر تقليدي.
FastAPI خيار قوي عندما تريد طريقة حديثة ونظيفة لبناء REST APIs في بايثون — خاصة إذا تهتم بنماذج الطلب/الاستجابة الواضحة وسلوك متوقع عند نمو الـ API.
FastAPI يتألّق في الحالات التالية:
FastAPI ليس دائمًا الإجابة الأبسط:
يمكن أن يكون FastAPI سريعًا جدًا عمليًا، لكن السرعة تعتمد على استدعاءات قاعدة البيانات، زمن الشبكة، ومنطق الأعمال. توقّع معدل إيصالية واستجابة جيدين لأحمال API النموذجية — فقط لا تفترض أن الإطار وحده سيحل مشاكل I/O البطيئة أو الاستعلامات غير الفعالة.
إذا بدا FastAPI مناسبًا، ركّز بعد ذلك على أنماط التوجيه، نماذج Pydantic، تكامل قاعدة البيانات، مهام الخلفية، والمصادقة الأساسية.
مسار عملي هو بناء مجموعة صغيرة من النقاط النهائية، ثم التوسّع مع تبعيات قابلة لإعادة الاستخدام واختبارات مع نمو الـ API. إذا أردت تسريع تأسيس البنية الأولية (مسارات، نماذج، وبنية جاهزة للنشر)، فكر في سير عمل مبني على تصور سريع — مثال: تشكيل النقاط في وضع "تخطيط" والتكرار من مواصفة واحدة. هذه منطقة يمكن أن تكون فيها أدوات مثل Koder.ai مفيدة: تخلق نموذجًا أوليًا من محادثة، ثم تصقله وتصدّر الشيفرة عندما تكون مستعدًا لتشغيلها كأي مشروع قياسي.
FastAPI هو إطار عمل ويب في بايثون لبناء واجهات برمجة التطبيقات مع أقل قدر من الشيفرة المتكررة. تكتب دوال نقاط نهاية (مثل @app.get("/users")) وFastAPI يتولى التوجيه، تحليل الطلبات، التحقق من البيانات، والرد بصيغة JSON.
ميزة رئيسية هي أن تلميحات النوع (type hints) ونماذج Pydantic تعمل كعقدة صريحة لما يقبله ويُرجعه الـ API.
الـ API هي مجموعة من عناوين URL (نقاط نهاية) التي يمكن لبرامج أخرى استدعاؤها لتبادل البيانات.
على سبيل المثال، قد يطلب عميل بيانات الطقس عبر GET /weather?city=Berlin، ويجيب الخادم بJSON منظم. العميل لا يحتاج وصولاً مباشراً إلى قاعدة البيانات — يكفيه استدعاء الـ API والحصول على الاستجابة.
التوجيه يربط طريقة HTTP + المسار بدالة بايثون.
في FastAPI عادةً ما تستخدم الديكوريتورات:
@app.get("/items") لعمليات القراءة@app.post("/items") لعمليات الإنشاء@app.put("/items/{id}") للتحديث/الاستبدال@app.delete("/items/{id}") للحذفمعاملات المسار هي جزء من هيكل العنوان وتستخدم عادة لتحديد مورد محدد (مطلوبة).
GET /users/42 → 42 هو معامل مسارمعاملات الاستعلام تضاف بعد ? وتكون غالبًا مرشحات اختيارية.
نماذج Pydantic تحدد شكل القواعد والبيانات (الأنواع، الحقول المطلوبة، القيود). يستخدمها FastAPI لـ:
إذا فشل التحقق، يرد FastAPI عادةً بـ 422 Unprocessable Entity مع تفاصيل توضح الحقل وسبب الخطأ.
يولد FastAPI تلقائيًا مخطط OpenAPI من نقاط النهاية وتلميحات الأنواع والنماذج.
تُقدَّم عادةً وثائق تفاعلية جاهزة:
/docs/redocبما أن المخطط مشتق من الشيفرة، تبقى الوثائق متزامنة مع التغييرات في المعاملات والنماذج.
استخدم async def عندما يقضي مسار الطلب وقتًا في الانتظار على عمليات I/O (استدعاءات قاعدة بيانات، طلبات HTTP خارجية، تخزين ملفات).
استخدم def العادية عندما:
مزج المسارات المتزامنة وغير المتزامنة في نفس التطبيق شائع ومسموح.
التبعيات هي "بلاطات بناء" قابلة لإعادة الاستخدام يحقنها FastAPI في نقاط النهاية عبر Depends().
تُستخدم عادةً لـ:
هذا يقلل التكرار ويركز المنطق المشترك في مكان واحد، بحيث تغير طريقة إنشاء جلسة DB أو تحميل المستخدم يحدث في مكان واحد فقط.
FastAPI لا يؤمن الـ API تلقائيًا — تختار الأسلوب وتطبقه. أنماط شائعة:
X-API-Key) للخدمات بين الخوادمتذكّر أيضًا الأساسيات:
لاختبار، يمكنك استخدام TestClient من FastAPI/Starlette لاستدعاء التطبيق داخل العملية (لا حاجة لخادم خارجي).
عناصر عملية للاختبار:
للنشر، شغّل خادم ASGI (مثل Uvicorn) مع أساسيات الإنتاج: تسجيل، نقاط صحة ()، قيود ووقت انتظار، وتهيئة عبر المتغيرات البيئية.
هذا يجعل واجهة الـ API واضحة وسهلة المسح مباشرة من الشيفرة.
GET /users?limit=10\u0026active=true → limit, active هما معاملات استعلام/health