如前所述,我们可以使用客户端cookie为Web应用程序存储大量有用的数据.我们之前已经看到,我们可以使用客户端cookie来存储对我们的Web应用程序有用的各种数据.这会导致很多安全漏洞,具体取决于您要保存的数据的重要性.
出于安全考虑,Django有一个用于cookie处理的会话框架.会话用于抽象cookie的接收和发送,数据保存在服务器端(如数据库中),客户端cookie只有一个会话ID用于标识.会话对于避免用户浏览器设置为"不接受"cookie的情况也很有用.
设置会话
在Django中,启用会话在项目 settings.py 中完成,方法是在 MIDDLEWARE_CLASSES 和 INSTALLED_APPS 选项中添加一些行.这应该在创建项目时完成,但总是要知道,所以 MIDDLEWARE_CLASSES 应该有 :
'django.contrib.sessions.middleware.SessionMiddleware'
INSTALLED_APPS 应该有 :
'django.contrib.sessions'
默认情况下,Django将会话信息保存在数据库中(django_session表)或集合),但您可以配置引擎以使用其他方式存储信息,例如:在文件或缓存.
会话已启用,每个请求(Django中任何视图的第一个参数)都有一个session(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, urlfrom django.views.generic import TemplateViewurlpatterns = 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("You are logged out.")
并将其与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是否已过期.