二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:Django会话
正如前面所讨论的,我们可以使用客户端cookie来为web应用存储大量有用的数据。我们之前已经看到,我们可以使用客户端Cookie来存储对我们的Web应用有用的各种数据。这会导致很多安全漏洞,这取决于您想要保存的数据的重要性。
出于安全原因,Django有一个cookie处理的会话框架。会话用于抽象cookie的接收和发送,数据保存在服务器端(如数据库中),客户端cookie只有一个用于识别的会话ID。会话对于避免用户浏览器被设置为“不接受”cookie的情况也很有用。
设置会话
在Django中,通过在 MIDDLEWARE_CLASSES 和 INSTALLED_APPS 选项中添加一些行,在项目 settings.py中 启用会话。这应该在创建项目时完成,但它总是很好的知道,所以 MIDDLEWARE_CLASSES 应该有 -
'django.contrib.sessions.middleware.SessionMiddleware'
而 INSTALLED_APPS 应该有 -
'django.contrib.sessions'
默认情况下,Django将会话信息保存在数据库(django_session表或集合)中,但您可以使用其他方式配置引擎以存储信息,如:in file 或in cache 。
当启用会话时,每个请求(Django中任何视图的第一个参数)都有一个会话(dict)属性。
我们来创建一个简单的示例来了解如何创建和保存会话。我们之前已经构建了一个简单的登录系统(请参阅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文件以更改网址,使其与我们的新视图配对 -
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是否过期。