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

会话控制

作者头像
星哥玩云
发布于 2022-09-14 09:48:54
发布于 2022-09-14 09:48:54
2.1K00
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

一、会话控制 COOKIE

1、概述

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

2、原因

http协议时无状态的

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

3、值的存储

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

4、设置cookie

方法

set_cookie()

原型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
path(<span class="hljs-string">'setcookie/'</span>,views.set_cookie_view),
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
url(<span class="hljs-string">r'^set_cookie_lifetime/'</span>,views.set_cookie_lifetime),
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
path(<span class="hljs-string">'^get_cookie/'</span>,views.get_cookie),
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
path(<span class="hljs-string">'^delete_cookie/'</span>,views.delete_cookie_view),
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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、存储原理

5、存储位置

基于数据库的会话

默认的会话存储方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.db"</span>

基于缓存的会话

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SESSION_ENGINE = <span class="hljs-string">"django.contrib.sessions.backends.cache"</span>

基于缓存和数据库的会话

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<!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
代码运行次数:0
运行
AI代码解释
复制
<!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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
24种R语言新手入门之热图(四)
热图比较有意思,最常用的科研可视化做图,观察显著、直接、简单粗暴。这是Toussaint Loua在1873年就曾使用过热图来绘制对巴黎各区的社会学统计。
生信初学者
2023/03/14
9600
24种R语言新手入门之热图(四)
pheatmap 排序
hclust 的顺序是靠order 和 labels 两个数据控制,labels 是有顺序的名称,其座次可以被索引提取。order
花落花相惜
2021/12/06
1.4K0
比较聚类:我该划分多少个聚类簇?
在上期文章层次聚类与聚类树中,不同对象之间的关系可以通过聚类树展现出来,通过聚类树我们可以观察哪些对象比较相似,哪些对象距离较远,从而对所有对象的关系有一个整体的把握。然而,这时候我们并没有获得一个明显的聚类簇划分,也即不知道对象可以划分为几类、谁和谁归为一类,以及这个聚类结果是不是合理,这可以通过比较聚类来实现。
SYSU星空
2022/05/05
8750
比较聚类:我该划分多少个聚类簇?
又是聚类分析可视化!
相比于聚类分析本身,我更喜欢它的结果可视化的部分,虽然之前介绍过很多了,但是今天这个方法,还是要强烈推荐一下。
医学和生信笔记
2022/11/15
3210
又是聚类分析可视化!
用 ComplexHeatmap 包绘制复杂热图
在 ComplexHeatmap 中单个热图由热图主体和热图组件组成。热图主体可按行或列进行拆分。热图组件包括标题,进化树,矩阵名称和热图注释,可分别放置于热图主体的四个侧面上,这些组件也可根据热图主体的顺序进行重新排序或拆分。
生信菜鸟团
2021/01/18
7.5K0
用 ComplexHeatmap 包绘制复杂热图
一文详解如何用 R 语言绘制热图
AI 研习社按:作为目前最常见的一种可视化手段,热图因其丰富的色彩变化和生动饱满的信息表达被广泛应用于各种大数据分析场景。同时,专用于大数据统计分析、绘图和可视化等场景的 R 语言,在可视化方面也提供了一系列功能强大、覆盖全面的函数库和工具包。 因此,对从业者而言,用 R 语言绘制热图就成了一项最通用的必备技能。本文将以 R 语言为基础,详细介绍热图绘制中遇到的各种问题和注意事项。原文作者 taoyan,原载于作者个人博客,AI 研习社获授权。 简介 本文将绘制静态与交互式热图,需要使用到以下R包和函数
AI研习社
2018/03/19
3.7K0
一文详解如何用 R 语言绘制热图
聚类树的合并展示
层次聚类(hierarchical clustering)就是通过对数据集按照某种方法进行层次分解,直到满足某种条件为止,常用的方法有UPGMA、ward.D2等。聚类树是层次聚类最常用的可视化方法,我们可通过比较聚类来确定最佳分类,详见往期文章层次聚类与聚类树和比较聚类。
SYSU星空
2022/05/05
5450
聚类树的合并展示
单细胞转录组之拷贝数变异分析
拷贝数变异(Copy number variation, CNV):基因组发生重排而导致的,一般指长度1 kb 以上的基因组片段的拷贝数增加或者减少, 主要表现为亚显微水平的重复或者缺失。因此称为“微”缺失或重复变异。
青青青山
2022/07/07
3.4K0
单细胞转录组之拷贝数变异分析
超详细的R语言热图绘制之complexheatmap:01
本书是对ComplexeHeatmap包的中文翻译(1-6章),部分内容根据自己的理解有适当的改动,但总体不影响原文。如有不明之处,以原文为准。原文请见:https://jokergoo.github.io/ComplexHeatmap-reference/book/
医学和生信笔记
2022/05/30
4.3K0
使用NMF代替层次聚类
前面我们在教程:使用R包deconstructSigs根据已知的signature进行比例推断,顺利的把508个病人,根据11个signature进行了比例推断,得到的比例矩阵以普通的热图,以及pheatmap包自带的层次聚类如下:
生信技能树
2020/06/09
3.1K0
「Workshop」第十五期:热图
https://www.bilibili.com/video/BV1Pa4y1E7WS
王诗翔呀
2022/01/21
1.7K0
「Workshop」第十五期:热图
R语言ggtree画圆形的树状图展示聚类分析的结果
那么圆形的树状图如何实现呢?我查找了一下相关资料。R语言包dendextend这个包可以实现,利用help(package="dendextend")查看帮助文档,能够看到其中的一个小例子
用户7010445
2020/11/13
3.7K0
R语言ggtree画圆形的树状图展示聚类分析的结果
无代码调整聚类热图分支顺序
聚类热图根据不同的聚类算法和距离计算方式,获得的热图分支结构会有一些不同。有时,我们也希望能在不改变分支结构的基础上,对热图分支的顺序进行一些调整,这就是推文聚类热图怎么按自己的意愿调整分支的顺序?的出发点。
生信宝典
2022/01/18
8340
无代码调整聚类热图分支顺序
R语言学习笔记-Day09
#Fix cell sizes and save to file with correct size
用户11190095
2024/07/17
1490
OSCA单细胞数据分析笔记9—Clustering
“物以类聚,人以群分” 分群步骤即将基因表达(降维结果)相似的细胞归为同一个群体,往往对应一种特定的细胞类型或者细胞轨迹状态。从这一步开始,就可以开始叙述我们的生物学故事了~
生信技能树jimmy
2021/07/02
2.3K1
OSCA单细胞数据分析笔记9—Clustering
245热图展示微生物组的物种和功能丰度或有无、距离矩阵
NGS系列文章包括NGS基础、在线绘图、转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这)、ChIP-seq分析 (ChIP-seq基本分析流程)、单细胞测序分析 (重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程)、DNA甲基化分析、重测序分析、GEO数据挖掘(典型医学设计实验GEO数据分析 (step-by-step))、批次效应处理等内容。
生信宝典
2020/09/01
3K0
245热图展示微生物组的物种和功能丰度或有无、距离矩阵
获取pheatmap聚类后和标准化后的结果
pheatmap是简单常用的热图绘制包,可以快速、简单、可定制的绘制漂亮热图。具体见R语言学习-热图简化和免费高颜值可定制在线绘图工具 ImageGP。
生信宝典
2019/06/20
2.1K0
获取pheatmap聚类后和标准化后的结果
手把手带你复现NC图表之Figure 4
探究从肺泡和外膜成纤维细胞亚群(在对照组织中富集)到肌成纤维细胞(在肿瘤组织中富集)的分化过程,对scRNA-seq数据集进行轨迹推断。结果表明外膜和肺泡成纤维细胞可以作为独立的祖细胞,肌成纤维细胞可以从这些祖细胞转分化
生信技能树jimmy
2023/09/26
4870
手把手带你复现NC图表之Figure 4
R语言学习 - 热图简化
热图绘制 - pheatmap 绘制热图除了使用ggplot2,还可以有其它的包或函数,比如pheatmap::pheatmap (pheatmap包中的pheatmap函数)、gplots::heatmap.2等。 相比于ggplot2作heatmap, pheatmap会更为简单一些,一个函数设置不同的参数,可以完成行列聚类、行列注释、Z-score计算、颜色自定义等。那我们来看看效果怎样。 data_ori <- "Grp_1;Grp_2;Grp_3;Grp_4;Grp_5 a;6.6;20.9;10
生信宝典
2018/02/05
2.8K0
R语言学习 - 热图简化
热图在单细胞数据分析中的应用
热图是一个以颜色变化来显示数据的可视化矩阵,Toussaint Loua在1873年就曾使用过热图来绘制对巴黎各区的社会学统计。我们就拿这张简单朴素的热图来讲一下热图怎么看。
生信技能树jimmy
2020/04/08
3.9K0
热图在单细胞数据分析中的应用
相关推荐
24种R语言新手入门之热图(四)
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 一、会话控制 COOKIE
    • 1、概述
    • 2、原因
    • 3、值的存储
    • 4、设置cookie
    • 5、获取cookie
    • 6、删除cookie
  • 二、会话控制 SESSION
    • 1、概述
    • 2、启用session
    • 3、使用session
    • 4、存储原理
    • 5、存储位置
    • 6、cookie 和session 的区别
    • 7、状态保持示例代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档