- Django 基本概念
- Django - 首页
- Django - 基础
- Django - 概述
- Django - 环境
- Django - 创建项目
- Django - 应用生命周期
- Django - 创建视图
- Django - URL 映射
- Django - 首页
- Django - 模板系统
- Django - MVT
- Django - 添加主模板
- Django 管理员
- Django 管理员 - 界面
- Django 管理员 - 创建用户
- Django 管理员 - 包含模型
- Django 管理员 - 设置显示字段
- Django 管理员 - 更新对象
- Django 模型
- Django - 模型
- Django - 插入数据
- Django - 更新数据
- Django - 删除数据
- Django - 更新模型
- Django 静态文件
- Django - 添加静态文件
- Django - 添加 CSS 文件
- Django 高级
- Django - 页面未找到 (404)
- Django - 页面重定向
- Django - 发送邮件
- Django - 通用视图
- Django - 表单处理
- Django - 文件上传
- Django - Apache 设置
- Django - Cookie 处理
- Django - 会话
- Django - 缓存
- Django - 评论
- Django - RSS
- Django - AJAX
- Django 有用资源
- Django - 快速指南
- Django - 有用资源
- Django - 讨论
Django - 会话
如前所述,我们可以使用客户端 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 中任何视图的第一个参数)都有一个会话(字典)属性。
让我们创建一个简单的示例来了解如何创建和保存会话。我们之前已经构建了一个简单的登录系统(请参阅 Django 表单处理章节和 Django Cookie 处理章节)。让我们将用户名保存在 Cookie 中,这样,如果未注销,当访问我们的登录页面时,您将看不到登录表单。基本上,让我们使我们在 Django Cookie 处理中使用的登录系统更安全,方法是在服务器端保存 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 时,您将看到以下页面:
您将被重定向到以下页面:
现在,如果您再次尝试访问 /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 是否已过期。