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

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

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

باختصار

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

ما ستتعلمه

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


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

  1. تجاهل فهارس قاعدة البيانات → يؤدي إلى استعلامات بطيئة مع نمو البيانات.
  2. خلط المنطق التجاري في Views → صعب الصيانة والاختبار؛ استخدم الخدمات أو طبقات المجال.
  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 في 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.

المراجع

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