Django Sessions 怎么用?Session 如何在 Django 中实现用户登录状态?

文章导读
上一个 测验 下一个 如前所述,我们可以使用客户端 cookie 来存储 web 应用的大量有用数据。我们之前已经看到,可以使用客户端 cookie 来存储对 web 应用有用的各种数据。这会导致许多安全漏洞,具体取决于你想要保存的数据的重要性。
📋 目录
  1. 设置会话
A A

Django - 会话



上一个
测验
下一个

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

出于安全考虑,Django 提供了一个用于处理 cookie 的 session 框架。Sessions 用于抽象 cookie 的接收和发送,数据保存在服务器端(例如在 database 中),而客户端 cookie 只包含一个用于识别的 session ID。Sessions 还有助于避免用户浏览器设置为不接受 cookie 的情况。

设置会话

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

'django.contrib.sessions.middleware.SessionMiddleware'

并且 INSTALLED_APPS 应该包含 −

'django.contrib.sessions'

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

启用会话后,每个请求(Django 中任何 view 的第一个参数)都会有一个 session(dict)属性。

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

为此,首先修改我们的登录 view,在服务器端保存用户名 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 view,如果 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 以匹配我们的新 view −

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 时,你会看到以下页面 −

Setting Up Sessions

然后你会被重定向到以下页面 −

Sessions Redirected Page

现在如果你再次访问 /myapp/connection,你会直接被重定向到第二个页面。

让我们创建一个简单的注销 view 来清除我们的 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,你会看到以下页面 −

Logged Out Page

如果你再次访问 /myapp/connection,你会看到登录表单(页面 1)。

使用会话的一些其他可能操作

我们已经看到了如何存储和访问会话,但值得知道的是,request 的 session 属性还有一些其他有用的操作,例如 −

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

  • get_expiry_age() − 返回此会话过期前的秒数。

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

  • clear_expired() − 从会话存储中移除已过期的会话。

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