会话控制 用来保持用户的状态 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
http协议时无状态的
每一次请求都是一次新的请求,不会记得之前的通信状态
cookie存储在客户端的浏览器 一般会限制存储cookie的个数为 20个 并且单个cookie保存值的大小不能超过4kb 存储在浏览器上为明文存储 所以不安全
方法
set_cookie()
原型
set_cookie(self, key, value=<span class="hljs-string">''</span>, max_age=<span class="hljs-keyword">None</span>, expires=<span class="hljs-keyword">None</span>, path=<span class="hljs-string">'/'</span>, domain=<span class="hljs-keyword">None</span>, secure=<span class="hljs-keyword">False</span>, httponly=<span class="hljs-keyword">False</span>)
参数
示例
设置cookie 不设置过期时间
path(<span class="hljs-string">'setcookie/'</span>,views.set_cookie_view),
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_cookie_view</span><span class="hljs-params">(req)</span>:</span>
res = HttpResponse(<span class="hljs-string">'设置cooke'</span>)
res.set_cookie(<span class="hljs-string">'name'</span>,<span class="hljs-string">'lucky'</span>)
<span class="hljs-keyword">return</span> res
注意:如果没有设置Cookie超时时间,表示关闭浏览器之后自动删除Cookie,Cookie尽量避免存储敏感信息
设置cookie并设置过期时间
url(<span class="hljs-string">r'^set_cookie_lifetime/'</span>,views.set_cookie_lifetime),
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_cookie_lifetime</span><span class="hljs-params">(req)</span>:</span>
res = HttpResponse(<span class="hljs-string">'设置cooke并设置过期时间'</span>)
<span class="hljs-comment"># 设置过期时间为一分钟</span>
<span class="hljs-comment"># res.set_cookie('name','lucky',max_age=60)</span>
res.set_cookie(<span class="hljs-string">'name'</span>,<span class="hljs-string">'zhangsan'</span>,expires=<span class="hljs-number">60</span>)
<span class="hljs-keyword">return</span> res
属性
request.COOKIES
格式
request.COOKIES.get(key)
示例
path(<span class="hljs-string">'^get_cookie/'</span>,views.get_cookie),
<span class="hljs-comment">#获取cookie</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_cookie</span><span class="hljs-params">(req)</span>:</span>
print(req.COOKIES)
value = req.COOKIES.get(<span class="hljs-string">'name'</span>)
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">"值为{}"</span>.format(value))
方法
delete_cookie()
格式
res.delete_cookie(key)
示例
path(<span class="hljs-string">'^delete_cookie/'</span>,views.delete_cookie_view),
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">delete_cookie_view</span><span class="hljs-params">(req)</span>:</span>
res = HttpResponse(<span class="hljs-string">'删除cookie'</span>)
res.delete_cookie(<span class="hljs-string">'name'</span>)
<span class="hljs-keyword">return</span> res
settings.py文件
INSTALLED_APPS = [
<span class="hljs-string">'django.contrib.sessions'</span>,
]
MIDDLEWARE = [
<span class="hljs-string">'django.contrib.sessions.middleware.SessionMiddleware'</span>,
]
注意
启用session后request对象才会有session属性
生成session存储所需要的系统表
python manage.py migrate
设置session不设置过期时间
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_session</span><span class="hljs-params">(req)</span>:</span>
req.session[<span class="hljs-string">'name'</span>] = <span class="hljs-string">'lucky'</span>
req.session[<span class="hljs-string">'sex'</span>] = <span class="hljs-string">'man'</span>
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'设置session'</span>)
注意:session默认存活时间为 俩周
可以去库中查看django_session表 把session的值使用base64解码出来
设置session并设置过期时间
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_session_lifetime</span><span class="hljs-params">(req)</span>:</span>
req.session.set_expiry(<span class="hljs-number">60</span>) <span class="hljs-comment">#过期时间1分钟</span>
req.session[<span class="hljs-string">'name'</span>] = <span class="hljs-string">'lucky'</span>
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'设置session并设置过期时间'</span>)
获取 session
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_session</span><span class="hljs-params">(req)</span>:</span>
v = req.session.get(<span class="hljs-string">'name'</span>,<span class="hljs-string">'default'</span>)
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'获取session-----{}'</span>.format(v))
删除 session
<span class="hljs-keyword">from</span> django.contrib.auth <span class="hljs-keyword">import</span> logout
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">del_session</span><span class="hljs-params">(req)</span>:</span>
req.session.flush() <span class="hljs-comment"># 清除所有session</span>
req.session.clear() <span class="hljs-comment"># 清除所有session 不删除表中数据</span>
logout(req) <span class="hljs-comment"># 清除所有session</span>
<span class="hljs-keyword">del</span> req.session[<span class="hljs-string">'name'</span>] <span class="hljs-comment"># 删除key为name的session</span>
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'清除session'</span>)
基于数据库的会话
默认的会话存储方式
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.db"</span>
基于缓存的会话
只存在本地内存中,如果丢失则不用找回,但是比数据库的方式读写更快
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.cache"</span>
基于缓存和数据库的会话
优先从本地缓存中获取,如果没有则从数据库中获取再同步到缓存
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.cached_db"</span>
redis作为缓存使用
安装
配置
SESSION_ENGINE = <span class="hljs-string">"redis_sessions.session"</span>
SESSION_REDIS_HOST = <span class="hljs-string">"10.0.12.34"</span> <span class="hljs-comment"># 主机</span>
SESSION_REDIS_POST = <span class="hljs-number">6379</span> <span class="hljs-comment"># 端口</span>
SESSION_REDIS_DB = <span class="hljs-number">0</span> <span class="hljs-comment"># 选择数据库</span>
SESSION_REDIS_PASSWORD = <span class="hljs-string">"lucky"</span> <span class="hljs-comment"># 密码</span>
SESSION_REDIS_PREFIX = <span class="hljs-string">"session"</span> <span class="hljs-comment"># 前缀</span>
路由
path(<span class="hljs-string">'index/'</span>, views.index),
path(<span class="hljs-string">'login/'</span>, views.login),
path(<span class="hljs-string">'dologin/'</span>, views.dologin),
path(<span class="hljs-string">'logout/'</span>, views.logout),
视图
<span class="hljs-keyword">from</span> django.shortcuts <span class="hljs-keyword">import</span> render,HttpResponse,redirect,reverse
<span class="hljs-comment"># 首页</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">index</span><span class="hljs-params">(req)</span>:</span>
<span class="hljs-keyword">return</span> render(req, <span class="hljs-string">'index.html'</span>)
<span class="hljs-comment"># 登录</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">login</span><span class="hljs-params">(req)</span>:</span>
<span class="hljs-keyword">return</span> render(req,<span class="hljs-string">'login.html'</span>)
<span class="hljs-comment"># 登录处理</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">dologin</span><span class="hljs-params">(req)</span>:</span>
username = req.POST.get(<span class="hljs-string">'username'</span>)
userpass = req.POST.get(<span class="hljs-string">'userpass'</span>)
<span class="hljs-keyword">if</span> username==<span class="hljs-string">'lucky'</span> <span class="hljs-keyword">and</span> userpass==<span class="hljs-string">'lucky123456'</span>:
req.session[<span class="hljs-string">'uid'</span>] = <span class="hljs-number">1</span>
req.session[<span class="hljs-string">'username'</span>] = username
<span class="hljs-keyword">return</span> redirect(reverse(<span class="hljs-string">'App:index'</span>))
<span class="hljs-keyword">return</span> redirect(reverse(<span class="hljs-string">'App:login'</span>))
<span class="hljs-comment"># 退出登录</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">logout</span><span class="hljs-params">(req)</span>:</span>
req.session.flush()
<span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">"<meta http-equiv='refresh' content='4;/'>退出成功4秒后条到首页 如不能跳到首页 请手动点击<a href='https://www.zutuanxue.com/'>首页</a>"</span>)
模板
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<style>
nav{
width: 100%;
height: 40px;
background-color: #000;
line-height: 40px;
}
nav span{
float: right;
color: #fff;
margin-right: 20px;
}
nav>span>a{
color:#fff;
font-size: 16px;
text-decoration: none;
}
</style>
</head>
<body>
<nav>
{% if username %}
<nav><span>欢迎:{{ username }} | <a href="{% url 'App:logout' %}">退出登录</a></span></nav>
{% else %}
<span><a href="{% url 'App:login' %}">登录</a> | <a href="#">注册</a></span></nav>
{% endif %}
<h1>首页</h1>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<marquee behavior="" direction=""><h2>登录</h2></marquee>
<center>
<form action="{% url 'App:dologin' %}" method="POST">
<p>用户名: <input type="text" name="username" minlength="6" maxlength="10" placeholder="请输入用户名..."></p>
<p>密码: <input type="text" name="userpass" onkeyup="(this.v=function(){this.value=this.value.replace(/[^0-9-]+/,'');}).call(this)" onblur="this.v();" placeholder="请输入密码..." maxlength="10"></p>
<p><input type="submit" value="submit"></p>
</form>
</center>
</body>
</html>
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有