前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >会话控制

会话控制

作者头像
星哥玩云
发布2022-09-14 17:48:54
2.1K0
发布2022-09-14 17:48:54
举报
文章被收录于专栏:开源部署开源部署

一、会话控制 COOKIE

1、概述

会话控制 用来保持用户的状态 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案

2、原因

http协议时无状态的

每一次请求都是一次新的请求,不会记得之前的通信状态

3、值的存储

cookie存储在客户端的浏览器 一般会限制存储cookie的个数为 20个 并且单个cookie保存值的大小不能超过4kb 存储在浏览器上为明文存储 所以不安全

4、设置cookie

方法

set_cookie()

原型

代码语言:javascript
复制
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>)

参数

  • key cookie的键
  • value cookie的值
  • max_age 最长使用时间(秒为单位)
  • expires 过期时间,优先级高(秒为单位)
  • path 生效的路径
  • domain 生效的域名
  • secure HTTPS传输时应设置为true
  • httponly 仅http传输 不能使用js获取cookie

示例

设置cookie 不设置过期时间

代码语言:javascript
复制
path(<span class="hljs-string">'setcookie/'</span>,views.set_cookie_view),
代码语言:javascript
复制
<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并设置过期时间

代码语言:javascript
复制
url(<span class="hljs-string">r'^set_cookie_lifetime/'</span>,views.set_cookie_lifetime),
代码语言:javascript
复制
<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

5、获取cookie

属性

request.COOKIES

格式

request.COOKIES.get(key)

示例

代码语言:javascript
复制
path(<span class="hljs-string">'^get_cookie/'</span>,views.get_cookie),
代码语言:javascript
复制
<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))

6、删除cookie

方法

delete_cookie()

格式

res.delete_cookie(key)

示例

代码语言:javascript
复制
path(<span class="hljs-string">'^delete_cookie/'</span>,views.delete_cookie_view),
代码语言:javascript
复制
<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

二、会话控制 SESSION

1、概述

  • 说明 服务器需要识别来自同一访问者的请求,这主要是通过浏览的cookie实现的。 访问者在第一次访问服务器时,服务器在其cookie中设置一个唯一的ID号——会话ID。 这样,访问者后续对服务器的访问头中将自动包含该信息,服务器通过这个ID号,即可区 隔不同的访问者
  • 会话 客户端与服务端一次通信称之为一次会话
  • http协议时无状态的 每一次请求都是一次新的请求,不会记得之前的通信状态
  • 状态保持 将会话信息得到存储
  • 存储的位置 存储在服务端:session
  • Session存储结构 以键值对方式存储

2、启用session

settings.py文件

代码语言:javascript
复制
INSTALLED_APPS = [
    <span class="hljs-string">'django.contrib.sessions'</span>,
]
MIDDLEWARE = [
 <span class="hljs-string">'django.contrib.sessions.middleware.SessionMiddleware'</span>,
]

注意

启用session后request对象才会有session属性

3、使用session

生成session存储所需要的系统表

python manage.py migrate

设置session不设置过期时间

  • 格式 request.session[key] = value
代码语言:javascript
复制
<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并设置过期时间

  • 格式 request.session.set_expiry(value) value值:
    • integer 整数 秒
    • 0 当前浏览会话结束
    • datetime
    • timedelta
    • None 依赖于全局session过期
代码语言:javascript
复制
<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

代码语言:javascript
复制
<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

  • clear() 清空所有session 会将session存储数据删除 但是不会将表中的整条session数据清除
  • flush() 清空所有 并删除表中的session数据
  • logout(request) 清空所有 并删除表中的session数据
  • del request.session[key] 删除某个session的值
代码语言:javascript
复制
<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>)

4、存储原理

空白.png
空白.png

5、存储位置

基于数据库的会话

默认的会话存储方式

代码语言:javascript
复制
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.db"</span>

基于缓存的会话

只存在本地内存中,如果丢失则不用找回,但是比数据库的方式读写更快

代码语言:javascript
复制
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.cache"</span>

基于缓存和数据库的会话

优先从本地缓存中获取,如果没有则从数据库中获取再同步到缓存

代码语言:javascript
复制
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.cached_db"</span>

redis作为缓存使用

安装

  • sudo pip install redis
  • sudo pip install django-redis-sessions==0.5.6

配置

代码语言:javascript
复制
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>

6、cookie 和session 的区别

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 ,考虑到安全应当使用session
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
  • 所以个人建议 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE中

7、状态保持示例代码

路由

代码语言:javascript
复制
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),

视图

代码语言:javascript
复制
<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">"&lt;meta http-equiv='refresh' content='4;/'&gt;退出成功4秒后条到首页 如不能跳到首页 请手动点击&lt;a href='https://www.zutuanxue.com/'&gt;首页&lt;/a&gt;"</span>)

模板

index.html

代码语言:javascript
复制
<!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

代码语言:javascript
复制
<!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>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、会话控制 COOKIE
    • 1、概述
      • 2、原因
        • 3、值的存储
          • 4、设置cookie
            • 5、获取cookie
              • 6、删除cookie
              • 二、会话控制 SESSION
                • 1、概述
                  • 2、启用session
                    • 3、使用session
                      • 4、存储原理
                        • 5、存储位置
                          • 6、cookie 和session 的区别
                            • 7、状态保持示例代码
                            相关产品与服务
                            对象存储
                            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档