1 概念
Session:在计算机中,尤其是在网络应用中,称为“会话控制”
。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。
Session:
- 服务器端会话技术
- 数据存储在服务器中
- 默认Session存储在内存中
- Django中默认会把Session持久化到数据库中
- Django中Session的默认过期时间为14天
- 主键是字符串
- 存储的数据使用了数据安全:(1)使用了
Base64
(2)在前部添加了一个混淆串 - Session依赖于Cookie
1.1 Django中启用Session
Session是服务器端会话技术,依赖于Cookie。
Django中启用Session:
(1)在settings中
INSTALLED_APPS = [
'django.contrib.sessions'
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
]
每个HttpRequest对象都有一个session属性
,也是一个类字典对象。
常用操作
方法 | 说明 |
---|---|
get(key,default=None) | 根据键获取会话的值 |
clear() | 清除所有会话 |
flush() | 删除当前的会话数据,并删除会话Cookie |
delete request['session_id'] | 删除会话 |
session.session_key | 获取session的key |
request.session['user']=username | 设置Session,数据存储到数据库中会使用编码Base64 |
2 Django-Session机制
详细机制请查看Session机制详解一文。
Session持久化到数据库是为了解决多个服务器之间的数据共享问题。
Django将Session存储到数据库表名为django_session
的表中。
将session_data
进行Base64
解码
可以看到数据格式为:混淆串+数据
2.1 Session依赖于Cookie
查看开发者工具,可以看到Cookie中有sessionid
,sessionid
对应数据库表中的session_key。
当清空Cookie后,Session中的数据就变成了脏数据。
2.2 Session运行机制图
3 Django-用例
需求:使用session编写用户登录操作。
(1)urls配置
# 根路由
urlpatterns = [
url(r'^helloSession/',include('helloSession.urls',namespace='helloSession'))
]
# 子路由
urlpatterns = [
url(r'^login/',views.login,name='login'), # 登录页面
url(r'^mine/', views.mine, name='mine'), # 个人主页
]
(2)视图函数
GET和POST写在一个函数里边,体现了程序的高内聚。
from django.http import HttpResponse
from django.shortcuts import render, redirect
# Create your views here.
from django.urls import reverse
def login(request):
if request.method == 'GET':
return render(request,template_name='login3.html')
elif request.method == 'POST':
username = request.POST.get('username')
request.session['username'] = username # 设置session
response = redirect(reverse('helloSession:mine'))
return response
def mine(request):
username = request.session.get('username') # 获取session
return HttpResponse(username)
(3)模板
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'helloSession:login' %}" method="post">
<span>账号:</span><input type="text" placeholder="请输入账号:" name="username">
<button>登录</button>
</form>
</body>
</html>
(4)访问
需求:使用Session怎么做退出用户操作。
方案
(1)删除cookie
def logout(request):
# 利用response删除
response = redirect(reverse('helloCookie:login'))
response.delete_cookie('username')
return response
(2)删除Session
def logout(request):
# 跳转到登录页面
response = redirect(reverse('helloCookie:login'))
del request.session['username']
return response
(3)Cookie、Session一起删除。(推荐使用,不会留下垃圾数据)
def logout(request):
# 跳转到登录页面
response = redirect(reverse('helloCookie:login'))
request.session.flush()
return response