تطبيق عملي لتعلم جانغو – الجزء السادس: إدارة الجلسات (Sessions)
في سياق بناء تطبيقات الويب الديناميكية باستخدام إطار العمل Django، تعتبر إدارة الجلسات (Sessions) من الأدوات الأساسية التي تتيح للمطورين حفظ معلومات عن المستخدمين بين الطلبات (HTTP requests) المختلفة. نظراً لأن بروتوكول HTTP بطبيعته هو بروتوكول غير متصل (stateless)، فإن القدرة على تذكر المستخدم وتخزين البيانات المؤقتة حول نشاطه عبر عدة صفحات أو زيارات يُعد ضرورة في أي تطبيق ويب تفاعلي، مثل تطبيقات تسجيل الدخول، سلال التسوق، تفضيلات المستخدم، وغيرها.
في هذا الجزء السادس من السلسلة التطبيقية حول تعلم Django، سيتم تناول مفهوم الجلسات بعمق، مع عرض كيفية تفعيلها، استخدامها، إدارة البيانات داخلها، وتوضيح الفروق بينها وبين الكوكيز، وكذلك تقديم حالات عملية توضح أهميتها في المشاريع الواقعية.
تعريف الجلسات في Django
الجلسة في Django هي آلية تُستخدم لحفظ بيانات تخص المستخدم على الخادم (Server-side) بدلًا من المتصفح. عند زيارة المستخدم للموقع لأول مرة، يقوم Django بإنشاء مُعرف جلسة فريد (Session ID) يتم تخزينه في الكوكيز داخل متصفح المستخدم، وفي الوقت ذاته يتم ربط هذا المعرف مع البيانات المخزنة على الخادم.
على سبيل المثال، عند تسجيل دخول مستخدم معين، يمكن استخدام الجلسة للاحتفاظ بمعرّف المستخدم حتى يتمكن من تصفح الموقع دون الحاجة لإعادة التحقق من هويته في كل صفحة.
تفعيل واستخدام الجلسات في مشروع Django
تأتي الجلسات مفعّلة افتراضياً في Django، حيث يتم استخدام django.contrib.sessions وهو تطبيق مُدمج ضمن الإعدادات الأساسية لأي مشروع جديد.
إعداد الجلسات في settings.py
pythonINSTALLED_APPS = [
...
'django.contrib.sessions',
...
]
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
...
]
# تحديد طريقة حفظ الجلسات
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # الحفظ في قاعدة البيانات
تهيئة قاعدة بيانات الجلسات
إذا كانت الجلسات تحفظ في قاعدة البيانات (وهو الوضع الافتراضي)، يجب إنشاء الجداول اللازمة:
bashpython manage.py migrate
هذا الأمر يقوم بإنشاء الجدول django_session في قاعدة البيانات، والذي يُستخدم لتخزين بيانات الجلسات.
كيفية استخدام الجلسات في العروض Views
للتعامل مع الجلسة في Django، يمكن الوصول إلى كائن request.session الذي يشبه قاموس Python، مما يسهل عملية تخزين واسترجاع البيانات.
تخزين بيانات في الجلسة
pythondef set_session(request):
request.session['username'] = 'mohammed'
request.session['is_admin'] = True
return HttpResponse("تم حفظ الجلسة")
استرجاع بيانات من الجلسة
pythondef get_session(request):
username = request.session.get('username', 'غير معروف')
is_admin = request.session.get('is_admin', False)
return HttpResponse(f"المستخدم: {username}، مسؤول: {is_admin}")
حذف بيانات من الجلسة
pythondef delete_session(request):
try:
del request.session['username']
except KeyError:
pass
return HttpResponse("تم حذف الجلسة")
ضبط عمر الجلسة وانتهائها
افتراضياً، تنتهي الجلسة عند إغلاق المتصفح، ولكن يمكن التحكم بعمر الجلسة باستخدام الإعداد التالي في settings.py:
pythonSESSION_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لحمايته من التزوير. -
تحديد خصائص الكوكيز:
pythonSESSION_COOKIE_SECURE = True # إرسال الكوكيز فقط عبر HTTPS
SESSION_COOKIE_HTTPONLY = True # منع الوصول إلى الكوكيز عبر JavaScript
SESSION_COOKIE_SAMESITE = 'Lax' # تقييد إرسال الكوكيز مع الطلبات الخارجية
-
آلية تدوير معرف الجلسة: من الأفضل تدوير معرف الجلسة عند تسجيل الدخول والخروج لمنع هجمات سرقة الجلسة (Session Hijacking).
pythonfrom django.contrib.auth import login
def my_login_view(request):
...
login(request, user)
request.session.cycle_key() # تدوير معرف الجلسة
مقارنة الجلسات (Sessions) والكوكيز (Cookies)
رغم التشابه الظاهري بين الجلسات والكوكيز في تخزين بيانات المستخدم، إلا أن الفروقات التقنية بينهما عميقة:
| الجانب | الجلسات | الكوكيز |
|---|---|---|
| موقع التخزين | على الخادم | في متصفح المستخدم |
| الأمان | أعلى، لأنها لا تُرسل البيانات مع كل طلب | أقل أمانًا، البيانات مكشوفة في المتصفح |
| الحجم | غير محدود نظريًا | 4KB فقط |
| إمكانية التعديل | لا يمكن للمستخدم تعديل البيانات | يمكن تعديل الكوكيز من طرف المستخدم |
| الاستخدام المثالي | بيانات حساسة أو كبيرة | تفضيلات بسيطة للمستخدم مثل اللغة |
حالات استخدام عملية للجلسات في Django
1. إدارة عملية تسجيل الدخول
عند تسجيل دخول المستخدم، يتم حفظ معرفه في الجلسة، مما يسمح للموقع بتعقب المستخدم على مدار الصفحات:
pythonfrom django.contrib.auth import authenticate, login
def login_view(request):
user = authenticate(username='ali', password='mypassword')
if user:
login(request, user)
return HttpResponse("تم تسجيل الدخول")
2. حفظ سلة التسوق
في مواقع التجارة الإلكترونية، يمكن استخدام الجلسات لحفظ منتجات سلة التسوق حتى لو لم يكن المستخدم مسجلاً:
pythondef 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. بفضل البنية القوية التي يوفرها الإطار، يصبح التعامل مع الجلسات مرناً وآمناً وسهلاً. القدرة على حفظ معلومات المستخدمين عبر الطلبات تعزز تجربة الاستخدام وتفتح المجال أمام تطوير تطبيقات أكثر تفاعلية وفعالية. ومع أن الجلسات تقدم الكثير من المزايا، فإن استخدامها يجب أن يتم ضمن ضوابط واضحة وواعية لضمان حماية البيانات والأداء العالي للتطبيق.
المصادر والمراجع
-
Django documentation – Sessions framework: https://docs.djangoproject.com/en/stable/topics/http/sessions/
-
Django settings reference: https://docs.djangoproject.com/en/stable/ref/settings/

