目录

Django - Sessions( Sessions)

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

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

设置会话

在Django中,通过向MIDDLEWARE_CLASSESINSTALLED_APPS选项添加一些行,在项目settings.py完成启用会话。 这应该在创建项目时完成,但总是很好知道,所以MIDDLEWARE_CLASSES应该 -

'django.contrib.sessions.middleware.SessionMiddleware'

并且INSTALLED_APPS应该 -

'django.contrib.sessions'

默认情况下,Django将会话信息保存在数据库(django_session表或集合)中,但您可以使用其他方式配置引擎以存储信息,例如:在file或在cache

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

让我们创建一个简单的示例来了解如何创建和保存会话。 我们之前已经构建了一个简单的登录系统(参见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文件以更改网址,以便与我们的新视图配对 -

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,您将直接重定向到第二个屏幕。

让我们创建一个简单的注销视图来删除我们的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,您将看到以下页面 -

登出页面

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

使用会话的一些更可能的操作

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

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

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

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

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

  • get_expire_at_browser_close() - 返回True或False,具体取决于用户的Web浏览器关闭时用户的会话cookie是否已过期。

↑回到顶部↑
WIKI教程 @2018