📅  最后修改于: 2020-10-25 10:04:18             🧑  作者: Mango
如前所述,我们可以使用客户端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表或集合)中,但是您可以配置引擎以使用其他方式存储信息,例如:在文件中或在缓存中。
启用会话后,每个请求(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文件以更改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时,您将看到以下页面-
您将被重定向到以下页面-
现在,如果您尝试再次访问/ 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)。
我们已经看到了如何存储和访问会话,但是很高兴知道请求的session属性还有一些其他有用的动作,例如-
set_expiry( value ) -设置会话的过期时间。
get_expiry_age() -返回此会话到期之前的秒数。
get_expiry_date() -返回此会话将过期的日期。
clear_expired() -从会话存储中删除过期的会话。
get_expire_at_browser_close() -返回True或False,这取决于关闭用户的Web浏览器时用户的会话cookie是否已过期。