Django وواجهات برمجة التطبيقات الخلفية: بناء خوادم خلفية قابلة للتوسع وآمنة وحديثة
٣٠ نوفمبر ٢٠٢٥
باختصار
- Django هو أحد أكثر إطارات Python نضجًا وتنوعًا لبناء واجهات API الخلفية.
- يقدم ORM ومصادقة وأدوات إدارة مدمجة تقلل بشكل كبير وقت التطوير.
- Django REST Framework (DRF) يوسع قدرات Django لواجهات RESTful APIs مع التسلسل، المصادقة، والتحكم في معدل الطلبات.
- التكوين الصحيح، التخزين المؤقت، ودعم التزامن يجعل واجهات API الخاصة بـ Django جاهزة للإنتاج وقابلة للتوسع.
- الأمان، الاختبارات، وقابلية المراقبة هي مفاتيح للحفاظ على خدمة خلفية موثوقة.
ما ستتعلمه
- كيف يعمل Django وDjango REST Framework معًا لإنشاء واجهات API قوية.
- كيفية تصميم وتنفيذ ونشر واجهات API خلفية قابلة للتوسع.
- متى تستخدم Django مقابل إطارات أخف مثل FastAPI أو Flask.
- كيفية التعامل مع المصادقة، التخزين المؤقت، والعمليات التزامنية.
- كيفية اختبار ومراقبة وأمان واجهات API الخاصة بـ Django في الإنتاج.
المتطلبات الأساسية
- معرفة أساسية بـ Python (دوال، فئات، بيئات افتراضية)
- الاطلاع على مفاهيم HTTP وREST
- اختياري: بعض الخبرة مع Django أو Flask
مقدمة: لماذا لا يزال Django يهيمن على تطوير الواجهات الخلفية
Django موجود منذ يوليو 2005 — يحتفل بعيد ميلاده العشرين في عام 2025 — ولا يزال أحد أكثر إطارات الواجهات الخلفية استخدامًا في تطوير ويب Python. فلسفته "مدمج مع كل شيء" تعني أنك تحصل على 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]
لكل طبقة مسؤولية واضحة:
- الموجه: يربط عناوين URL بالعروض.
- ViewSet: يتعامل مع المنطق لطرق HTTP.
- Serializer: يحول بين كائنات Python وJSON.
- Model: يحدد مخطط البيانات.
- ORM: يدير عمليات قاعدة البيانات.
متى تستخدم Django ومتى لا تستخدم Django
| السيناريو | استخدم Django | تجنب Django |
|---|---|---|
| أنت تقوم ببناء تطبيق ويب متكامل مع API | ✅ | |
| تحتاج إلى مصادقة مدمجة، ORM، وadmin | ✅ | |
| تريد خدمة microservice خفيفة | 🚫 | |
| تحتاج إلى تأخير منخفض جدًا أو تزامن عالي جدًا | 🚫 | |
| تفضل معمارية async-first | ⚠️ فكر في FastAPI |
إذا كنت تبني backend مونوليتيكًا أو متوسط التعقيد حيث قابلية الصيانة والأمان أهم من السرعة الخام، فإن 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. التسلسل الزائد
المشكلة: تسلسل querysets الكبيرة يمكن أن يبطئ الاستجابات.
الحل: استخدم الترقيم والحد من الحقول.
from rest_framework.pagination import PageNumberPagination
class TodoPagination(PageNumberPagination):
page_size = 10
3. I/O محجوب في العروض async
دعم Django للمتزامن قد تطور بشكل كبير منذ إدخاله في الإصدار 3.1. اعتبارًا من Django 5.x، لديك إمكانية الوصول إلى عروض async، وطرق ORM async، وإرسال إشارات async. ومع ذلك، لأفضل أداء، استخدم مكتبات متوافقة مع async للـ 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',
}
}
مثال على العروض async
from django.http import JsonResponse
import asyncio
async def async_status(request):
await asyncio.sleep(1)
return JsonResponse({'status': 'ok'})
طرق ORM async (Django 4.1+)
قدم Django 4.1 واجهات ORM متوافقة مع async مع طرق مُسبوقة بـ 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)
- رؤوس 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 عادةً ما تتضمن:
- التسجيل: Use
logging.config.dictConfig()for structured logs. - المؤشرات: Integrate with Prometheus or StatsD.
- التتبع: Use OpenTelemetry for distributed tracing.
مثال على تكوين التسجيل:
# 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 الإنتاجية.
الأخطاء الشائعة التي يرتكبها الجميع
- تجاهل فهارس قاعدة البيانات → يؤدي إلى استعلامات بطيئة مع زيادة البيانات.
- خلط المنطق التجاري في العروض → أصعب في الصيانة والاختبار؛ استخدم الخدمات أو طبقات المجال.
- عدم استخدام متغيرات البيئة → مخاطرة أمنية؛ لا تقم أبدًا بدفع الأسرار إلى نظام التحكم بالإصدار.
- تخطي الاختبارات → يسبب تراجعات؛ استهدف تغطية 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 في عرض غير متزامن |
استدعاء 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، والتخزين المؤقت، والدعم غير المتزامن، والاختبارات المناسبة، يمكنك تقديم واجهات API آمنة وقابلة للتوسع وسهلة الصيانة لكل من الشركات الناشئة والأنظمة المؤسسية.
الأسئلة الشائعة
س1: هل Django مناسب للخدمات الصغيرة؟
يمكن أن يكون، لكن طبيعته كطبقة كاملة قد تضيف عبئًا. للخدمات الصغيرة الخفيفة، فكر في FastAPI أو Flask. للخدمات الأكبر التي تستفيد من بيئة Django، فهو يعمل جيدًا.
س2: هل Django يستطيع التعامل مع الطلبات غير المتزامنة؟
نعم. منذ الإصدار 3.1، يدعم Django العروض غير المتزامنة. أضاف Django 4.1+ طرق ORM غير متزامنة، وDjango 5.x يشمل إرسال الإشارات غير المتزامن. ومع ذلك، تستخدم اتصالات قاعدة البيانات ملفات تغليف متزامنة داخليًا.
س3: ما مدى أمان Django لواجهات API العامة؟
آمن جدًا إذا تم تكوينه بشكل صحيح — يشمل حمايات مدمجة ضد أهم ثغرات OWASP Top 10 بما في ذلك CSRF، XSS، وحقن SQL.
س4: ما أفضل طريقة للتوسع في واجهات API الخاصة بـ Django؟
استخدم التخزين المؤقت (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.