Django وواجهات برمجة التطبيقات الخلفية: بناء خوادم خلفية قابلة للتوسع وآمنة وحديثة

٣٠ نوفمبر ٢٠٢٥

Django and Backend APIs: Building Scalable, Secure, and Modern Backends

باختصار

  • Django هو أحد أكثر إطارات Python نضجًا وتنوعًا لبناء واجهات API الخلفية.
  • يقدم ORM ومصادقة وأدوات إدارة مدمجة تقلل بشكل كبير وقت التطوير.
  • Django REST Framework (DRF) يوسع قدرات Django لواجهات RESTful APIs مع التسلسل، المصادقة، والتحكم في معدل الطلبات.
  • التكوين الصحيح، التخزين المؤقت، ودعم التزامن يجعل واجهات API الخاصة بـ Django جاهزة للإنتاج وقابلة للتوسع.
  • الأمان، الاختبارات، وقابلية المراقبة هي مفاتيح للحفاظ على خدمة خلفية موثوقة.

ما ستتعلمه

  1. كيف يعمل Django وDjango REST Framework معًا لإنشاء واجهات API قوية.
  2. كيفية تصميم وتنفيذ ونشر واجهات API خلفية قابلة للتوسع.
  3. متى تستخدم Django مقابل إطارات أخف مثل FastAPI أو Flask.
  4. كيفية التعامل مع المصادقة، التخزين المؤقت، والعمليات التزامنية.
  5. كيفية اختبار ومراقبة وأمان واجهات 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 الإنتاجية.


الأخطاء الشائعة التي يرتكبها الجميع

  1. تجاهل فهارس قاعدة البيانات → يؤدي إلى استعلامات بطيئة مع زيادة البيانات.
  2. خلط المنطق التجاري في العروض → أصعب في الصيانة والاختبار؛ استخدم الخدمات أو طبقات المجال.
  3. عدم استخدام متغيرات البيئة → مخاطرة أمنية؛ لا تقم أبدًا بدفع الأسرار إلى نظام التحكم بالإصدار.
  4. تخطي الاختبارات → يسبب تراجعات؛ استهدف تغطية 80%+ للمسارات الحرجة.
  5. عدم تكوين 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.

المراجع

  1. الوثائق الرسمية لـ Django
  2. Django REST Framework
  3. دعم Django غير المتزامن
  4. إطار عمل التخزين المؤقت لـ Django
  5. أمان Django
  6. OWASP Top 10 Security Risks
  7. djangorestframework-simplejwt
  8. Graphene-Django