Django - Sessions

  • 简述

    如前所述,我们可以使用客户端 cookie 为 Web 应用程序存储大量有用的数据。我们之前已经看到,我们可以使用客户端 cookie 来存储对我们的 Web 应用程序有用的各种数据。这会导致许多安全漏洞,具体取决于您要保存的数据的重要性。
    出于安全原因,Django 有一个用于 cookie 处理的 session 框架。 session 用于抽象cookie的接收和发送,数据保存在服务器端(如数据库中),客户端cookie只有一个 session ID用于标识。 session 对于避免用户浏览器设置为“not accept” cookies 的情况也很有用。
  • 设置 session

    在 Django 中,启用 session 是在您的项目中完成的settings.py,通过在MIDDLEWARE_CLASSESINSTALLED_APPS选项。这应该在创建项目时完成,但知道总是很好,所以MIDDLEWARE_CLASSES应该有 -
    
    'django.contrib.sessions.middleware.SessionMiddleware'
    
    INSTALLED_APPS应该有 -
    
    'django.contrib.sessions'
    
    默认情况下,Django 将 session 信息保存在数据库(django_session 表或集合)中,但您可以将引擎配置为使用其他方式存储信息,例如:file或在cache.
    启用 session 后,每个请求(Django 中任何视图的第一个参数)都有一个 session (dict)属性。
    让我们创建一个简单的示例来看看如何创建和保存 session 。我们之前已经构建了一个简单的登录系统(参见 Django 表单处理章节和 Django Cookies 处理章节)。让我们将用户名保存在 cookie 中,这样,如果未注销,在访问我们的登录页面时,您将看不到登录表单。基本上,让我们通过在服务器端保存 cookie 来使我们在 Django Cookie 处理中使用的登录系统更加安全。
    为此,首先让我们更改我们的登录视图以保存我们的用户名 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 时,您将看到以下页面 -
    设置 session
    您将被重定向到以下页面 -
     session 重定向页面
    现在,如果您再次尝试访问 /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)。

    使用 session 的更多可能操作

    我们已经了解了如何存储和访问 session ,但很高兴知道请求的 session 属性还有一些其他有用的操作,例如 -
    • set_expiry (value)− 设置 session 的过期时间。
    • get_expiry_age()− 返回此 session 到期前的秒数。
    • get_expiry_date()− 返回此 session 的到期日期。
    • clear_expired()− 从 session 存储中删除过期 session 。
    • get_expire_at_browser_close()− 返回 True 或 False,取决于用户的 Web 浏览器关闭时用户的 session cookie 是否已过期。