English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

جلسة Session في Django

如前所述,我们可以在Web应用程序客户端使用Cookie来存储大量有用的数据。我们在此之前已经看到可以使用客户端的cookie存储各种数据,在Web应用程序这是非常有用的。这就导致了很多要保存数据的重要性和一些安全漏洞问题。

出于安全原因,Django有一个会话框架来处理Cookies。会话用于抽象地接收和发送cookie,数据保存在服务器端(如数据库),而客户端的cookie只是有识别会话ID。会话还有助于避免在用户浏览器设置为“不接受”cookies行为。

设置会话

在Django中,通过在项目settings.py中添加一些行到MIDDLEWARE_CLASSES和INSTALLED_APPS选项来完成会话。这应该在创建项目完成后进行,但它总是很容易知道,所以MIDDLEWARE_CLASSES应该类似如下 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ar.oldtoolbag.com
# Date : 2020-08-08
'django.contrib.sessions.middleware.SessionMiddleware'

INSTALLED_APPS应该有 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ar.oldtoolbag.com
# Date : 2020-08-08
'django.contrib.sessions'

默认情况下,Django在数据库中保存会话信息(表django_session中或集合),但可以用其他方式类似配置的引擎存储信息:在文件中或在缓存中。

当会话启用时,每个请求(在Django任何针对第一个参数)都有一个会话(字典)属性。

让我们创建一个简单的示例,看看如何创建和保存会话。我们之前已经建立了一个简单的登录系统(见Django表单处理章节和DjangoCookies处理章节)。让我们将用户名保存在cookie中。因此,如果不注销,访问我们的登录页面时,你不会看到登录表单。在Django中,通过在服务器端保存Cookie,使用cookies处理更加安全。

关于这一点,首先让我们修改登录代码以在服务器端保存username -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ar.oldtoolbag.com
# Date : 2020-08-08
def login(request):
    username = 'not logged in'
    if request.method == 'POST':
       MyLoginForm = LoginForm(request.POST)
       if MyLoginForm.is_valid():
          username = MyLoginForm.cleaned_data['username']
          request.session['username'] = username
       else:
          MyLoginForm = LoginForm()
 
    return render(request, 'loggedin.html', {'username' : username})

إذاً، دعونا نخلق رؤية مرتبطة بنموذج تسجيل الدخول، إذا تم تعيين الكوكي لن يتم عرض النموذج -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ar.oldtoolbag.com
# Date : 2020-08-08
def formView(request):
    if request.session.has_key('username'):
       username = request.session['username']
       return render(request, 'loggedin.html', {'username' : username})
    else:
       return render(request, 'login.html', {})

الآن، دعونا نعدل ملف url.py ونغير URL، لتناسب الرؤية الجديدة -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ar.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, url
 from django.views.generic import TemplateView
 urlpatterns = patterns('myapp.views',
    url(r'^connection/','formView', name = 'loginform'),
    url(r'^login/', 'login', name = 'login'))

عند زيارة /myapp/connection، يمكنك رؤية الصفحة التالية -

سيتم توجيهك إلى الصفحة التالية -

الآن، إذا حاولت زيارة /myapp/connection مرة أخرى، سيتم توجيهك مباشرة إلى الشاشة الثانية.

دعونا نخلق رؤية تسجيل الخروج بسيطة لتنظيف الكوكي.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ar.oldtoolbag.com
# Date : 2020-08-08
def logout(request):
    try:
       del request.session['username']
    except:
       pass
    return HttpResponse("<strong>You are logged out.</strong>")

وإلى جانب ذلك في myapp/url.py لتكوين URL تسجيل الخروج

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ar.oldtoolbag.com
# Date : 2020-08-08
url(r'^logout/', 'logout', name = 'logout'),

الآن، إذا قمت بزيارة /myapp/logout، فستحصل على الصفحة التالية-

إذا قمت بزيارة /myapp/connection مرة أخرى، فستحصل على نموذج الـ login (الشاشة 1).

العمليات التي يمكن استخدامها مع الجلسة

لقد رأينا كيفية تخزين ووصول إلى بيانات الجلسة، وإليك مثال جيد لفهم خصائص الجلسة المطلوبة وأيضًا بعض العمليات المفيدة الأخرى مثل:

  • set_expiry (value) − تعيين وقت انتهاء صلاحية الجلسة

  • get_expiry_age() − يعود إلى عدد الثواني حتى انتهاء صلاحية الجلسة

  • get_expiry_date() − يعود إلى تاريخ انتهاء صلاحية الجلسة الحالية

  • clear_expired() − إزالة التخزين المنتهي صلاحيته للجلسة

  • get_expire_at_browser_close()   − يعود إلى true أو false، اعتمادًا على انتهاء صلاحية ملف الـ cookie للجلسة في متصفح المستخدم عند إغلاق المتصفح