البرمجة

إدارة الجلسات في Django

تطبيق عملي لتعلم جانغو – الجزء السادس: إدارة الجلسات (Sessions)

في سياق بناء تطبيقات الويب الديناميكية باستخدام إطار العمل Django، تعتبر إدارة الجلسات (Sessions) من الأدوات الأساسية التي تتيح للمطورين حفظ معلومات عن المستخدمين بين الطلبات (HTTP requests) المختلفة. نظراً لأن بروتوكول HTTP بطبيعته هو بروتوكول غير متصل (stateless)، فإن القدرة على تذكر المستخدم وتخزين البيانات المؤقتة حول نشاطه عبر عدة صفحات أو زيارات يُعد ضرورة في أي تطبيق ويب تفاعلي، مثل تطبيقات تسجيل الدخول، سلال التسوق، تفضيلات المستخدم، وغيرها.

في هذا الجزء السادس من السلسلة التطبيقية حول تعلم Django، سيتم تناول مفهوم الجلسات بعمق، مع عرض كيفية تفعيلها، استخدامها، إدارة البيانات داخلها، وتوضيح الفروق بينها وبين الكوكيز، وكذلك تقديم حالات عملية توضح أهميتها في المشاريع الواقعية.


تعريف الجلسات في Django

الجلسة في Django هي آلية تُستخدم لحفظ بيانات تخص المستخدم على الخادم (Server-side) بدلًا من المتصفح. عند زيارة المستخدم للموقع لأول مرة، يقوم Django بإنشاء مُعرف جلسة فريد (Session ID) يتم تخزينه في الكوكيز داخل متصفح المستخدم، وفي الوقت ذاته يتم ربط هذا المعرف مع البيانات المخزنة على الخادم.

على سبيل المثال، عند تسجيل دخول مستخدم معين، يمكن استخدام الجلسة للاحتفاظ بمعرّف المستخدم حتى يتمكن من تصفح الموقع دون الحاجة لإعادة التحقق من هويته في كل صفحة.


تفعيل واستخدام الجلسات في مشروع Django

تأتي الجلسات مفعّلة افتراضياً في Django، حيث يتم استخدام django.contrib.sessions وهو تطبيق مُدمج ضمن الإعدادات الأساسية لأي مشروع جديد.

إعداد الجلسات في settings.py

python
INSTALLED_APPS = [ ... 'django.contrib.sessions', ... ] MIDDLEWARE = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', ... ] # تحديد طريقة حفظ الجلسات SESSION_ENGINE = 'django.contrib.sessions.backends.db' # الحفظ في قاعدة البيانات

تهيئة قاعدة بيانات الجلسات

إذا كانت الجلسات تحفظ في قاعدة البيانات (وهو الوضع الافتراضي)، يجب إنشاء الجداول اللازمة:

bash
python manage.py migrate

هذا الأمر يقوم بإنشاء الجدول django_session في قاعدة البيانات، والذي يُستخدم لتخزين بيانات الجلسات.


كيفية استخدام الجلسات في العروض Views

للتعامل مع الجلسة في Django، يمكن الوصول إلى كائن request.session الذي يشبه قاموس Python، مما يسهل عملية تخزين واسترجاع البيانات.

تخزين بيانات في الجلسة

python
def set_session(request): request.session['username'] = 'mohammed' request.session['is_admin'] = True return HttpResponse("تم حفظ الجلسة")

استرجاع بيانات من الجلسة

python
def get_session(request): username = request.session.get('username', 'غير معروف') is_admin = request.session.get('is_admin', False) return HttpResponse(f"المستخدم: {username}، مسؤول: {is_admin}")

حذف بيانات من الجلسة

python
def delete_session(request): try: del request.session['username'] except KeyError: pass return HttpResponse("تم حذف الجلسة")

ضبط عمر الجلسة وانتهائها

افتراضياً، تنتهي الجلسة عند إغلاق المتصفح، ولكن يمكن التحكم بعمر الجلسة باستخدام الإعداد التالي في settings.py:

python
SESSION_COOKIE_AGE = 1200 # العمر بالثواني (هنا 20 دقيقة) SESSION_EXPIRE_AT_BROWSER_CLOSE = True # انتهاء الجلسة بإغلاق المتصفح

في حال أردت أن تبقى الجلسة قائمة حتى بعد إغلاق المتصفح، اجعل SESSION_EXPIRE_AT_BROWSER_CLOSE = False.


أنواع محركات الجلسات في Django

Django يتيح عدة خيارات لتخزين بيانات الجلسات، يمكن تحديدها عبر المتغير SESSION_ENGINE:

المحرك القيمة الوصف
قاعدة البيانات 'django.contrib.sessions.backends.db' الحفظ في جدول قاعدة البيانات
الكاش 'django.contrib.sessions.backends.cache' الحفظ في نظام التخزين المؤقت
ملفات 'django.contrib.sessions.backends.file' الحفظ في ملفات داخل السيرفر
الكاش+قاعدة بيانات 'django.contrib.sessions.backends.cached_db' يحفظ في الكاش، وإن لم يوجد يتم اللجوء إلى قاعدة البيانات
الجلسات الموقّتة 'django.contrib.sessions.backends.signed_cookies' تحفظ بيانات الجلسة بالكامل داخل الكوكيز بشكل مشفّر

كل طريقة لها استخداماتها الخاصة حسب متطلبات المشروع. مثلاً، الحفظ في الكاش يُفضل في تطبيقات الأداء العالي، بينما الحفظ في الكوكيز مناسب لتطبيقات صغيرة لا تتطلب سرية عالية.


حماية الجلسات من التلاعب والهجمات

لضمان سلامة نظام الجلسات، يتبع Django عددًا من السياسات الأمنية:

  • توقيع الكوكيز: يتم توقيع معرف الجلسة باستخدام مفتاح سري SECRET_KEY لحمايته من التزوير.

  • تحديد خصائص الكوكيز:

python
SESSION_COOKIE_SECURE = True # إرسال الكوكيز فقط عبر HTTPS SESSION_COOKIE_HTTPONLY = True # منع الوصول إلى الكوكيز عبر JavaScript SESSION_COOKIE_SAMESITE = 'Lax' # تقييد إرسال الكوكيز مع الطلبات الخارجية
  • آلية تدوير معرف الجلسة: من الأفضل تدوير معرف الجلسة عند تسجيل الدخول والخروج لمنع هجمات سرقة الجلسة (Session Hijacking).

python
from django.contrib.auth import login def my_login_view(request): ... login(request, user) request.session.cycle_key() # تدوير معرف الجلسة

مقارنة الجلسات (Sessions) والكوكيز (Cookies)

رغم التشابه الظاهري بين الجلسات والكوكيز في تخزين بيانات المستخدم، إلا أن الفروقات التقنية بينهما عميقة:

الجانب الجلسات الكوكيز
موقع التخزين على الخادم في متصفح المستخدم
الأمان أعلى، لأنها لا تُرسل البيانات مع كل طلب أقل أمانًا، البيانات مكشوفة في المتصفح
الحجم غير محدود نظريًا 4KB فقط
إمكانية التعديل لا يمكن للمستخدم تعديل البيانات يمكن تعديل الكوكيز من طرف المستخدم
الاستخدام المثالي بيانات حساسة أو كبيرة تفضيلات بسيطة للمستخدم مثل اللغة

حالات استخدام عملية للجلسات في Django

1. إدارة عملية تسجيل الدخول

عند تسجيل دخول المستخدم، يتم حفظ معرفه في الجلسة، مما يسمح للموقع بتعقب المستخدم على مدار الصفحات:

python
from django.contrib.auth import authenticate, login def login_view(request): user = authenticate(username='ali', password='mypassword') if user: login(request, user) return HttpResponse("تم تسجيل الدخول")

2. حفظ سلة التسوق

في مواقع التجارة الإلكترونية، يمكن استخدام الجلسات لحفظ منتجات سلة التسوق حتى لو لم يكن المستخدم مسجلاً:

python
def add_to_cart(request, product_id): cart = request.session.get('cart', []) cart.append(product_id) request.session['cart'] = cart return HttpResponse("تمت إضافة المنتج")

3. حفظ خطوات التقدم في نموذج متعدد الصفحات

عند استخدام نماذج متعددة الخطوات، يمكن حفظ بيانات المستخدم المؤقتة في الجلسة إلى حين اكتمال الإدخال.


أفضل الممارسات في استخدام الجلسات

  • تخزين الحد الأدنى من البيانات: لا تستخدم الجلسة لتخزين بيانات ضخمة أو حساسة ما لم تكن هناك حاجة ماسة لذلك.

  • حذف البيانات بعد الانتهاء منها: حافظ على نظافة الجلسة عن طريق حذف البيانات التي لم تعد مستخدمة.

  • استخدام معرفات عشوائية: عند التعامل مع بيانات قابلة للاستغلال، استخدم معرفات عشوائية يصعب تخمينها.

  • استخدام الحماية من التزوير CSRF: تفعيل واستخدام csrf_token في النماذج لتجنب التلاعب بجلسات المستخدم.

  • تحديث الجلسة باستمرار: لضمان عدم انتهاء الجلسة في منتصف عملية، يمكن تحديث عمر الجلسة في كل طلب.


خاتمة

إدارة الجلسات هي عنصر لا غنى عنه في أي تطبيق ويب مبني باستخدام Django. بفضل البنية القوية التي يوفرها الإطار، يصبح التعامل مع الجلسات مرناً وآمناً وسهلاً. القدرة على حفظ معلومات المستخدمين عبر الطلبات تعزز تجربة الاستخدام وتفتح المجال أمام تطوير تطبيقات أكثر تفاعلية وفعالية. ومع أن الجلسات تقدم الكثير من المزايا، فإن استخدامها يجب أن يتم ضمن ضوابط واضحة وواعية لضمان حماية البيانات والأداء العالي للتطبيق.


المصادر والمراجع