HTTP协议是无状态的,每次请求都是新的请求;
客户端与服务器端的一次通信就是一次会话。
可使用cookie和session在客户端或者服务端存储有关会话的数据,来进行状态保持;
cookie使用在上篇。本篇是使用session进行状态保持及使用Redis存储session的笔记。
存储方式
Cookie:所有的数据存储在客户端,不要存储敏感的数据。
Session:所有数据存储在服务端,在客户端用cookie存储session_id。
状态保持:在一段时间内跟踪请求者的状态,以实现跨页面访问当前的请求者的数据。
注意:
不同请求者之间不会共享这个数据,与请求者一一对应。
启用session
settings.py文件中
session中间件
使用session
启用session后,每个HttpRequest对象都有一个类似字典对象的session数据。
使用方法
get(key, default=None) 根据键值获取session值
clear() 清空所有的会话
flush() 删除当前会话并删除会话的cookie
使用示例
设置路由
# session使用
path('blog', views.blog, name='blog'),
path('login', views.login, name='login'),
path('loginHandle', views.login_handle, name='loginHandle'),
path('checkout', views.checkout, name='checkout'),
设置视图
from django.shortcuts import redirect
def blog(request):
"""blog网站"""
username = request.session.get('name', '游客')
return render(request, 'blog/index.html', {'username': username})
def login(request):
""" 登录页面 """
return render(request, 'blog/login.html')
def login_handle(request):
""" 登录操作 """
username = request.POST.get('username')
# 存储session
request.session['name'] = username
return redirect('blog')
def checkout(request):
""" 退出 """
# request.session.clear()
request.session.flush()
return redirect('blog')
创建模板
首页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<style>
#user {
margin-left:100px;
}
.nav ul li{
float:left;
list-style:none;
width:50px;
border-left:1px solid #000;
padding-left:20px;
}
.nav > ul > li.first{
border:none;
}
.clear {
clear:both;
}
.content {
margin-top:10px;
}
</style>
</head>
<body>
<div class="header">
<b>blog首页</b>
<span id="user">
当前登录:
{% if username == '游客' %}
{{username}} <a href="/myapp/login">去登录</a>
{% else %}
{{username}} <a href="/myapp/checkout">退出</a>
{% endif %}
</span>
</div>
<div class="nav">
<ul>
<li class="first"><a href="#">推荐</a></li>
<li><a href="#">Python</a></li>
<li><a href="#">PHP</a></li>
<li><a href="#">Java</a></li>
<li><a href="#">Go</a></li>
</ul>
</div>
<div class="clear"></div>
<div class="content">
网站内容网站内容网站内容网站内容网站内容网站内容
</div>
</body>
</html>
登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>blog登录</title>
</head>
<body>
<h2>blog登录</h2>
<form action="/myapp/loginHandle" method="post">
名称:<input type="text" name="username">
<br/>
密码:<input type="password" name="pwd">
<br/>
<input type="submit" value="登录">
</form>
</body>
</html>
效果
未登录
登录页面
登录后
设置过期时间
set_expiry(value)
如果不设置,两个星期后过期
参数为整数
request.session.set_expiry(10)
参数:时间对象
0 关闭浏览器时失效
None 永不过期
存储session位置
数据库:默认存储在数据库中
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
缓存:只存储在本地,如果丢失不能找回,比数据库快
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
数据库和缓存:优先从本地缓存中获取,读取不到再从数据库中获取
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
redis缓存session
安装
pip install django-redis-sessions
配置settings.py
在settings.py最后一行增加,配置可按照使用redis修改
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
验证redis存储
通过redis客户端连接取数据
首先从cookie中拿到session_id
然后通过redis中取session数据