Django 会话

Django 会话

如前所述,我们可以使用客户端cookies存储大量有用的数据用于Web应用程序。我们之前已经看到,我们可以使用客户端cookies来存储各种对我们的Web应用程序有用的数据。这会导致很多安全漏洞,取决于您想要保存的数据的重要性。

出于安全原因,Django有一个用于处理cookies的会话框架。会话用于抽象化接收和发送cookies,数据保存在服务器端(如数据库中),并且客户端cookies只有一个用于标识的会话ID。会话还可用于避免用户浏览器设置为“不接受”cookies的情况。

设置会话

在Django中,启用会话是通过在项目的 settings.py 中添加一些行到 MIDDLEWARE_CLASSESINSTALLED_APPS 选项来完成的。这应该在创建项目时完成,但是了解这个过程总是好的,因此 MIDDLEWARE_CLASSES 应该包含 –

'django.contrib.sessions.middleware.SessionMiddleware'

并且 INSTALLED_APPS 应该有−

'django.contrib.sessions'

默认情况下,Django将会把会话信息保存在数据库中(django_session表或集合),但你可以配置引擎使用其他方式保存信息,比如:在 文件 中或者在 缓存 中。

当启用会话时,每个请求(Django中任何视图的第一个参数)都有一个会话(字典)属性。

让我们创建一个简单的示例来演示如何创建和保存会话。我们之前已经构建了一个简单的登录系统(参见Django表单处理章节和Django处理Cookies章节)。让我们把用户名保存在一个Cookie中,这样,如果没有注销登录,在访问我们的登录页面时你将不会看到登录表单。基本上,让我们通过在服务器端保存Cookie来使我们在处理Django Cookies时使用的登录系统更加安全。

为此,首先让我们修改我们的登录视图,将用户名Cookie保存在服务器端−

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}

然后,让我们为登录表单创建 formView 视图,在 cookie 设置的情况下,我们不显示表单 –

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更改为与我们的新视图匹配 –

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时,您将看到以下页面 –

Django 会话

然后您将被重定向到以下页面 –

Django 会话

现在,如果你再次尝试访问/myapp/connection,你将直接被重定向到第二个屏幕。

让我们创建一个简单的注销视图,用于删除我们的cookie。

def logout(request):
   try:
      del request.session['username']
   except:
      pass
   return HttpResponse("<strong>You are logged out.</strong>")

将其与myapp/url.py中的注销URL配对。

url(r'^logout/', 'logout', name = 'logout'),

现在,如果您访问/myapp/logout,您将看到以下页面:

Django 会话

如果您再次访问/myapp/connection,您将会得到登录表单(屏幕1)。

使用会话的其他可能操作

我们已经了解了如何存储和访问会话,但是知道请求的会话属性还有一些其他有用的操作是很好的,如:

  • set_expiry(value) - 设置会话的过期时间。

  • get_expiry_age() - 返回直到此会话过期的秒数。

  • get_expiry_date() - 返回此会话将过期的日期。

  • clear_expired() - 从会话存储中删除过期的会话。

  • get_expire_at_browser_close() - 根据用户的Web浏览器是否关闭来返回True或False,表明用户的会话Cookie是否已过期。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程