Django وواجهات API الخلفية: بناء خلفيات قابلة للتوسع، آمنة، وحديثة
٣٠ نوفمبر ٢٠٢٥
باختصار
- Django هو أحد أكثر إطارات Python نضجًا وتنوعًا لبناء واجهات API للخلفية.
- يوفر ORM مدمج، ومصادقة، وأدوات إدارة تقلل بشكل كبير وقت التطوير.
- Django REST Framework (DRF) يوسع قدرات Django لواجهات RESTful APIs مع التسلسل، المصادقة، والتحكم في التدفق.
- التكوين الصحيح، التخزين المؤقت، ودعم غير متزامن يجعل واجهات Django جاهزة للإنتاج وقابلة للتوسع.
- الأمان، الاختبار، والقابلية للمراقبة هي عوامل أساسية للحفاظ على خدمة خلفية موثوقة.
ما ستتعلمه
- كيف يعمل Django وDjango REST Framework معًا لإنشاء واجهات API قوية.
- كيفية تصميم وتنفيذ ونشر واجهات API خلفية قابلة للتوسع.
- متى تستخدم Django مقابل إطارات أخف مثل FastAPI أو Flask.
- كيفية التعامل مع المصادقة، التخزين المؤقت، والعمليات غير المتزامنة.
- كيفية اختبار ومراقبة وتأمين واجهات Django في الإنتاج.
المتطلبات الأساسية
- معرفة أساسية بـ Python (وظائف، فئات، بيئات افتراضية)
- الاطلاع على مفاهيم HTTP وREST
- اختياري: بعض الخبرة مع Django أو Flask
المقدمة: لماذا لا يزال Django يهيمن على تطوير الواجهة الخلفية
Django موجود منذ يوليو 2005 — يحتفل بعيد ميلاده العشرين في عام 2025 — ولا يزال أحد أكثر إطارات الواجهة الخلفية استخدامًا في تطوير ويب Python. فلسفته "batteries included" تعني أنك تحصل على ORM، المصادقة، واجهة الإدارة، والMiddleware مباشرة. لكن في عام 2025، Django ليس فقط للتطبيقات التقليدية — بل هو منافس جاد للواجهات الخلفية الحديثة API.
Django REST Framework (DRF) يوسع قدرات Django بأدوات قوية لبناء واجهات RESTful APIs. معًا، يشكلان مجموعة مثبتة تُستخدم من قبل شركات كبرى وشركات ناشئة على حد سواء — أشهرها إنستغرام، التي لا تزال تعمل بما يصفه المهندسون بأنه "أكبر نشر للإطار الويب Django في العالم".
هذا ما يجعل Django قويًا بشكل خاص لواجهات API الخلفية:
- الاتساق: يتبع قواعد واضحة، مما يجعل المشاريع الكبيرة قابلة للصيانة.
- الأمان: حمايات مدمجة ضد الثغرات الشائعة (CSRF، XSS، حقن SQL).
- قابلية التوسع: يعمل جيدًا مع التخزين المؤقت، العروض غير المتزامنة، وخوادم WSGI/ASGI.
- المجتمع: نظام بيئي ضخم من الإضافات والامتدادات.
Django مقابل إطارات الواجهة الخلفية الأخرى
لنقارن Django مع إطارات Python الشائعة الأخرى لتطوير API:
| الميزة | Django + DRF | FastAPI | Flask |
|---|---|---|---|
| النوع | إطار كامل النطاق | API-مُركّز | ميكرو إطار |
| ORM | مدمج (Django ORM) | اختياري (SQLAlchemy، Tortoise) | اختياري |
| المصادقة | مدمج | يتطلب إضافات | يتطلب إضافات |
| دعم غير متزامن | شامل (العروض، طرق ORM، الإشارات) | أصلي (قائم على ASGI) | جزئي (مسارات غير متزامنة على خيوط منفصلة) |
| واجهة الإدارة | نعم | لا | لا |
| الأفضل لـ | التطبيقات الكبيرة والمعقدة | واجهات API عالية الأداء غير المتزامنة | نماذج أولية خفيفة |
باختصار، Django مثالي للمشاريع التي تحتاج إلى هيكلية، نضج، وأمان — بينما FastAPI يبرز في الأحمال الوظيفية الثقيلة غير المتزامنة وعالية الأداء حيث دعم ASGI الأصلي ضروري.
ملاحظة حول دعم Flask غير المتزامن
أضاف Flask 2.0+ دعم مسارات غير متزامنة، لكنه يشغل الكوروتينات على خيوط منفصلة بدلاً من استخدام حلقة حدث كاملة. مما يجعله أقل أداءً مقارنة بإطارات غير المتزامنة مثل FastAPI في سيناريوهات عالية التزامن.
إعداد مشروع Django API
لنستعرض بناء واجهة REST API بسيطة باستخدام Django وDjango REST Framework. الأمثلة تستخدم Django 5.2 LTS (الإصدار المستقر الحالي حتى نوفمبر 2025) وDRF 3.16.
الخطوة 1: تثبيت التبعيات
python -m venv venv
source venv/bin/activate
pip install django djangorestframework
الخطوة 2: إنشاء مشروع Django
django-admin startproject api_project
cd api_project
python manage.py startapp todos
الخطوة 3: تعريف النموذج
# todos/models.py
from django.db import models
class Todo(models.Model):
title = models.CharField(max_length=100)
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
الخطوة 4: إنشاء المُسلسل
# todos/serializers.py
from rest_framework import serializers
from .models import Todo
class TodoSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ['id', 'title', 'completed']
الخطوة 5: بناء عرض API
# todos/views.py
from rest_framework import viewsets
from .models import Todo
from .serializers import TodoSerializer
class TodoViewSet(viewsets.ModelViewSet):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
الخطوة 6: تهيئة URLs
# api_project/urls.py
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from todos.views import TodoViewSet
router = DefaultRouter()
router.register(r'todos', TodoViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('API/', include(router.urls)),
]
الخطوة 7: تشغيل الخادم
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
مثال الإخراج
System check identified no issues (0 silenced).
Django version 5.2.8, using settings 'api_project.settings'
Starting development server at http://127.0.0.1:8000/
لديك الآن REST API كامل الوظائف مع نقاط نهاية CRUD — كل ذلك في أقل من 50 سطرًا من الكود.
نظرة عامة على البنية
هذه نظرة مبسطة لكيفية تعامل Django مع طلبات الواجهة الخلفية لـ API:
graph TD
A[Client Request] --> B[URL Router]
B --> C[ViewSet / View]
C --> D[Serializer]
D --> E[Model / ORM]
E --> F[Database]
F --> D
D --> C
C --> G[Response JSON]
كل طبقة لها مسؤولية واضحة:
- الموجه: يربط الروابط بالعروض.
- مجموعة العرض: تتعامل مع المنطق لطرق HTTP.
- المُسلسل: يحول بين كائنات Python وJSON.
- النموذج: يحدد مخطط البيانات.
- ORM: يدير عمليات قاعدة البيانات.
متى تستخدم Django ومتى لا تستخدم Django
| السيناريو | استخدم Django | تجنب Django |
|---|---|---|
| أنت تبني تطبيق ويب متكامل مع API | ✅ | |
| تحتاج إلى مصادقة مدمجة، ORM، وadmin | ✅ | |
| تريد مايكرو سيرفيس خفيف | 🚫 | |
| تحتاج إلى تأخير منخفض جدًا أو تزامن عالٍ جدًا | 🚫 | |
| تفضل بنية غير متزامنة أولاً | ⚠️ فكر في FastAPI |
إذا كنت تبني خلفية مونوليتي أو متوسطة التعقيد حيث قابلية الصيانة والأمان أهم من السرعة الخام، Django مناسب جدًا.
المزالق الشائعة & الحلول
1. مشكلة N+1 للاستعلام
المشكلة: استعلامات ORM غير الفعالة تسبب عوائق أداء.
الحل: استخدم select_related() أو prefetch_related().
# Before (N+1 queries)
for todo in Todo.objects.all():
print(todo.user.username)
# After (2 queries total)
todos = Todo.objects.select_related('user')
for todo in todos:
print(todo.user.username)
2. التسلسل المفرط
المشكلة: التسلسل المفرط لمجموعات الاستعلامات الكبيرة يمكن أن يبطئ الاستجابات.
الحل: استخدم الترقيم والحد من الحقول.
from rest_framework.pagination import PageNumberPagination
class TodoPagination(PageNumberPagination):
page_size = 10
3. الـ I/O المُعَطِّل في العروض غير المتزامنة
دعم Django غير المتزامن تطور بشكل كبير منذ إصداره في الإصدار 3.1. اعتبارًا من Django 5.x، يمكنك الوصول إلى عروض غير متزامنة، وطرق ORM غير متزامنة، وإرسال إشارات غير متزامن. ومع ذلك، لأفضل أداء، استخدم مكتبات متوافقة مع غير المتزامن للـ I/O (مثل httpx بدلًا من requests).
تحسين الأداء
التخزين المؤقت
يدعم Django عدة خلفيات تخزين مؤقت (Redis, Memcached, قائم على الملفات). مثال مع Redis باستخدام django-Redis:
# settings.py
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'Redis://127.0.0.1:6379/1',
}
}
مثال على العروض غير المتزامنة
from django.http import JsonResponse
import asyncio
async def async_status(request):
await asyncio.sleep(1)
return JsonResponse({'status': 'ok'})
طرق ORM غير المتزامنة (Django 4.1+)
Django 4.1 أدخل واجهات ORM المتوافقة مع غير المتزامن مع طرق مُسبوقة بـ a:
# Async ORM operations
user = await User.objects.aget(pk=1)
todos = [todo async for todo in Todo.objects.filter(completed=True)]
new_todo = await Todo.objects.acreate(title="New Task")
تحذير مهم: بينما واجهة async شاملة، فإن عمليات قاعدة البيانات الأساسية لا تزال تستخدم sync_to_async() مغلفات داخليًا. محركات قاعدة البيانات async الحقيقية لا تزال قيد التطوير. المعاملات لا تعمل بعد في وضع async.
فهرسة قاعدة البيانات
يجب دائمًا فهرسة الحقول المستخدمة في الفلاتر:
class Todo(models.Model):
title = models.CharField(max_length=100, db_index=True)
اعتبارات الأمان
Django يحتوي على إعدادات افتراضية قوية لأمان الويب:
- حماية CSRF مُفعّلة افتراضيًا عبر
CsrfViewMiddleware. - حماية XSS عبر هروب القوالب التلقائي.
- حماية من حقن SQL عبر معايرة ORM.
- تشفير كلمات المرور باستخدام PBKDF2-SHA256 (720,000 تكرار افتراضيًا في Django 5.x). يُوصى باستخدام Argon2 لكنه يتطلب مكتبة
argon2-cffi.
يمكنك أيضًا إضافة:
- تقييد المعدل (عبر DRF throttling)
- رؤوس CORS لواجهات برمجة التطبيقات عبر النطاقات (
django-cors-headers) - فرض HTTPS باستخدام
SECURE_SSL_REDIRECT = True
قائمة مراجعة أفضل ممارسات الأمان
# settings.py (production)
DEBUG = False
ALLOWED_HOSTS = ['yourdomain.com']
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000
اختبار واجهات برمجة تطبيقات Django
يتكامل TestCase الخاص بـ Django بشكل وثيق مع ORM وعميل الاختبار.
from django.test import TestCase
from rest_framework.test import APIClient
from .models import Todo
class TodoAPITest(TestCase):
def setUp(self):
self.client = APIClient()
self.todo = Todo.objects.create(title='Test Todo')
def test_get_todos(self):
response = self.client.get('/API/todos/')
self.assertEqual(response.status_code, 200)
def test_create_todo(self):
response = self.client.post('/API/todos/', {'title': 'New Todo'})
self.assertEqual(response.status_code, 201)
self.assertEqual(Todo.objects.count(), 2)
يمكنك دمج هذا في سير عمل CI/CD باستخدام GitHub Actions أو GitLab CI.
المراقبة والقابلية للملاحظة
تتضمن مراقبة واجهات برمجة التطبيقات Django عادةً:
- السجلات: استخدم
logging.config.dictConfig()للسجلات المُهيكلة. - المقاييس: قم بالتكامل مع Prometheus أو StatsD.
- التتبع: استخدم OpenTelemetry للتتبع الموزع.
مثال لتكوين السجلات:
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
},
'root': {
'handlers': ['console'],
'level': 'INFO',
},
}
مثال واقعي: توسيع نطاق Django API
تستخدم الخدمات الكبيرة Django لواجهات برمجة التطبيقات الخلفية في الإنتاج. أطلقت إنستغرام في أكتوبر 2010 باستخدام بايثون وDjango، وتستمر في الحفاظ على أحد أكبر توزيعات Django في العالم، والتي تخدم أكثر من 2 مليار مستخدم. على مر الوقت، قاموا بالتوسع عن طريق:
- تجزئة قواعد البيانات
- استخدام Redis للتخزين المؤقت
- تحويل المهام الثقيلة إلى عمال Celery
- النشر خلف موازنات الحمل باستخدام Gunicorn + Nginx
تظل هذه الأنماط معيارية في نشرات Django الإنتاجية.
الأخطاء الشائعة التي يرتكبها الجميع
- تجاهل فهارس قاعدة البيانات → يؤدي إلى استعلامات بطيئة مع نمو البيانات.
- خلط المنطق التجاري في Views → صعب الصيانة والاختبار؛ استخدم الخدمات أو طبقات المجال.
- عدم استخدام المتغيرات البيئية → خطر أمني؛ لا تقم أبدًا بحفظ الأسرار في نظام التحكم بالإصدار.
- تخطي الاختبارات → يسبب تراجعات؛ استهدف تغطية 80%+ للمسارات الحرجة.
- عدم تكوين
ALLOWED_HOSTSبشكل صحيح → يفتح ثغرات أمنية؛ يجب تحديدها بشكل صريح في البيئة الإنتاجية.
دليل استكشاف الأخطاء وإصلاحها
| الخطأ | السبب | الحل |
|---|---|---|
ImproperlyConfigured: You must define ALLOWED_HOSTS |
إعدادات مفقودة | أضف ALLOWED_HOSTS في الإعدادات |
CSRF verification failed |
رمز مفقود | أدرج رمز CSRF في طلبات POST |
OperationalError: no such table |
لم يتم تطبيق الهجرات | قم بتشغيل python manage.py migrate |
ImportError: No module named rest_framework |
تَابِع مفقود | ثبّت djangorestframework |
SynchronousOnlyOperation في View غير متزامن |
استدعاء ORM متزامن في سياق غير متزامن | استخدم الطرق غير المتزامنة التي تبدأ بـ a أو sync_to_async() |
GraphQL مع Django
إذا احتاج واجهة العميل إلى استعلامات مرنة، فكر في استخدام GraphQL. الخيارات الرئيسية هي:
- Graphene-Django (v3.2.3): ناضج ومستخدم على نطاق واسع، على الرغم من أن وتيرة التطوير قد تباطأت.
- Strawberry-Django: بديل حديث يكتسب شعبية، مع دعم أفضل لتلميحات النوع ودعم غير متزامن.
مثال باستخدام Graphene-Django:
# schema.py
import graphene
from graphene_django import DjangoObjectType
from .models import Todo
class TodoType(DjangoObjectType):
class Meta:
model = Todo
fields = ('id', 'title', 'completed')
class Query(graphene.ObjectType):
todos = graphene.List(TodoType)
def resolve_todos(self, info):
return Todo.objects.all()
schema = graphene.Schema(query=Query)
تحدي جربه بنفسك
- أضف مصادقة JWT باستخدام
djangorestframework-simplejwt. - أضف نقطة نهاية
/healthتُبلغ عن حالة قاعدة البيانات والذاكرة المؤقتة. - نفّذ عروضًا غير متزامنة للعمليات الثقيلة على I/O.
- انشر API إلى مزود سحابي (مثل Render، Railway، AWS Elastic Beanstalk).
الاستنتاجات الرئيسية
Django يظل أحد أكثر الأدوات قدرة لبناء واجهات برمجة التطبيقات الخلفية. باستخدام Django REST Framework، والتخزين المؤقت، ودعم غير المتزامن، والاختبار الصحيح، يمكنك تقديم واجهات برمجة آمنة وقابلة للتوسع وسهلة الصيانة لكل من الشركات الناشئة والأنظمة المؤسسية.
أسئلة مكررة
س1: هل Django مناسب للميكروسيرفيس؟
يمكن أن يكون، لكن طبيعته Full-Stack قد تضيف عبئًا. للميكروسيرفيس الخفيفة، فكر في FastAPI أو Flask. للخدمات الأكبر التي تستفيد من نظام Django البيئي، فهو يعمل بشكل جيد.
س2: هل Django يستطيع التعامل مع طلبات غير متزامنة؟
نعم. منذ الإصدار 3.1، يدعم Django العروض غير المتزامنة. أضاف Django 4.1+ طرق ORM غير متزامنة، ويحتوي Django 5.x على إرسال إشارات غير متزامن. ومع ذلك، تستخدم اتصالات قواعد البيانات غلاف متزامن داخليًا.
س3: ما مدى أمان Django لواجهات برمجة التطبيقات العامة؟
آمن جدًا إذا تم تكوينه بشكل صحيح — يحتوي على حمايات مدمجة ضد أكبر 10 ثغرات OWASP بما في ذلك CSRF، XSS، وحقن SQL.
س4: ما أفضل طريقة لتوسيع نطاق واجهات Django API؟
استخدم التخزين المؤقت (Redis)، والعروض غير المتزامنة للعمليات المقيدة بـ I/O، والتوسيع الأفقي مع Gunicorn، ونسخ قراءة قواعد البيانات، والتوازن بين الأحمال.
س5: هل يجب استخدام GraphQL مع Django؟
إذا احتاج واجهة العميل إلى استعلامات مرنة، نعم. Graphene-Django ناضج؛ Strawberry-Django بديل حديث مع دعم غير متزامن أفضل.
س6: ما الجديد في Django 5.x؟
Django 5.0 (ديسمبر 2023) جلب تحسينات في عرض حقول النماذج وقوالب مبسطة. أضاف Django 5.1 طرق مصادقة غير متزامنة. Django 5.2 LTS (الحالي) هو الإصدار الموصى به للمشاريع الجديدة.
الخطوات التالية
- استكشف ميزات Django 5.2 LTS في ملاحظات الإصدار الرسمية.
- أضف مصادقة باستخدام مصادقة الرمز المميز المدمجة في DRF أو JWT.
- قم بإعداد التخزين المؤقت مع Redis للنقاط النهائية ذات الزيارات العالية.
- نفّذ وثائق شاملة لـ API باستخدام drf-spectacular.