Django Cookie和Session
Django Cookie和Session
【一】介绍
【1】起因
- HTTP协议四大特性
- 基于请求响应模式:客户端发送请求,服务端返回响应
- 基于TCP/IP之上:作用于应用层之上的协议
- 无状态:HTTP协议本身不保存客户端信息
- 短链接:1.0默认使用短链接,请求-响应后断开连接
- 因为无状态
- 导致客户端和服务端无法正常长时间的通讯
- 所以需要一种方法来打破这种情况
- Cookie和Session是Web开发中常用的两种持久化会话状态的方法
【2】Cookie和Session
(1)介绍
-
cookie
- Cookie是服务器发送到用户浏览器并保存在浏览器上的一块数据
- 他会在浏览器下一次向服务器发送请求时被携带并发送到服务器上
-
session
- Session是另一种保存用户数据的方法,但数据是保存到服务器端的
- Session通过生成一种叫做Session ID的唯一标识符,保存在cookie中或者通过URL传递,以便在多个请求中可以识别和跟踪用户
(2)关系
- session和cookie的主要关系是
- session通常使用cookie来存储Session ID
- 以便在多个请求之间跟踪用户
- 但是也可以通过其他方式(URL)
(3)异同
- 存储位置:
- cookie存储在客户端,session存储在服务端
- 安全性:
- 由于cookie存在客户端,所以安全性较低
- 如果信息是密码这种敏感信息,还是用session
- 生命周期:
- cookie可以设置过期时间,如果不设置时间,那么关闭浏览器时,cookie就会被删除
- session的生命周期通常由服务器设置,当用户关闭浏览器并长时间误操作,session也会过期然后删除
- 存贮容量:
- cookie的大小通常有限制(4KB)
- session理论上是没有大小限制的
【二】Django操作cookie
【1】语法
- 以HttpResponse为例
- 另外的两把斧也可以
(1)设置cookie
http_res = HttpResponse()
http_res.set_cookie(key, value)
(2)获取cookie
request.COOKIES.get(key)
(3)设置过期时间
- 不指定这个参数的话
- 那么cookie将是会话Cookie
- 即在浏览器关闭后会被删除
- max_age默认单位是秒
- 可以使用
datetime
模块的timedelta
快速换算单位 max_age = timedelta(days=1).total_seconds()
- 可以使用
- IE浏览器使用
expires
这个参数
http_res = HttpResponse()
http_res.set_cookie(key, value, max_age)
(4)注销cookie
http_res = HttpResponse()
http_res.delete_cookie(key)
- 视图层
def get_cookie(request):res = request.COOKIES.get("name")print(res)return HttpResponse(res)def set_cookie(request):http_res = HttpResponse()# 浏览器关闭后会被删除http_res.set_cookie("name", "bruce")# 5秒后这个cookie会被删除# http_res.set_cookie("name", "bruce", max_age=5)# 注销cookieres = http_res.delete_cookie("name")print(res)return http_res
【2】示例
(1)装饰器登录功能
- 要求
- 功能界面
func
需要登录才可以使用,- 如果没有登录就跳转到登录界面
- 登录完成以后,自动跳转到主页
- 主页不需要进行登录验证
- 功能界面
- 前端(登录)
- 其他界面显示文字即可
- 直接HttpResponse
<form action="" method="post"><p>username: <input type="text" name="username"></p><p>password: <input type="password" name="password"></p><button class="">提交</button>
</form>
- 视图层
login_decorator
:登录验证装饰器login
:登陆函数- home:主界面
func1
、func2
功能界面
def login_decorator(func):def inner(request, *args, **kwargs):if request.COOKIES.get("login_info"):res = func(request, *args, **kwargs)return resreturn redirect('/login/')return innerdef login(request):if request.method == "POST":username = request.POST.get("username")password = request.POST.get("password")# 正常需要和数据库数据校验# 这里简单一点if username == "bruce" and password == "000":response = redirect('/home/')response.set_cookie("login_info", username + password)return responsereturn render(request, 'login.html', locals())def home(request):return HttpResponse("主页")@login_decorator
def func1(request):return HttpResponse("func1")@login_decorator
def func2(request):return HttpResponse("func2")
(2)页面跳转登录功能
- 在原先的基础上
- 加上那个界面触发的登录
- 在登录成功以后返回到那个界面
- 精髓:发送POST请求带上GET请求的内容
def login_decorator(func):def inner(request, *args, **kwargs):next_url = request.get_full_path()if request.COOKIES.get("login_info"):res = func(request, *args, **kwargs)return resreturn redirect(f'/login/?next={next_url}')return innerdef login(request):# http://127.0.0.1:8000/login/?next=/func1/# 此时发送的是POST请求# 但是携带了get的内容if request.method == "POST":username = request.POST.get("username")password = request.POST.get("password")# 正常需要和数据库数据校验# 这里简单一点if username == "bruce" and password == "000":next_url = request.GET.get("next")next_url = next_url if next_url else '/home/'response = redirect(next_url)response.set_cookie("login_info", username + password)return responsereturn render(request, 'login.html', locals())
【三】Django操作session
【0】准备
- session是保存在服务器的
- 那么Django就需要一个文件来保存session数据
- 这个文件就是在数据迁移时自动创建的表单
django_sessoin
- 即如果新项目想要使用session需要先迁移一下数据
【1】语法
(1)设置session
- 内部执行过程
- 产生一个随机字符串
- 保存随机字符串和加密数据
- 最后将随机字符串返回给浏览器,存储在cookie中
- 格式:
sessionid:随机字符串
- 格式:
- 添加多个键值对数据
- 最终还是对应一个
sessionid
- 最终还是对应一个
request.session['key'] = value
(2)获取session
- 内部执行过程
- 获取客户端发来的随机字符串
- 去存储session的
django_sessoin
表单中对比查询随机字符串 - 比对成功自动解密处理数据(根据key找value)
- 比对失败则
request.session
中的数据为None
request.session.get('key')
(3)设置过期时间
- value是整数:多少秒过期
- value是日期对象:
datetime.datetime
对象,会话将在这个指定的日期和时间过期。 - value是0:退出浏览器窗口就过期
- 不设置(None),过期策略将依赖于全局session配置
- 这是django的settings的文件中的session_cookie_age配置
- 默认是14天
- 可以不设置,设置了就必须要给值
- 过期会删除客户端和服务端的session,但是
- 客户端的自动删除了
- 服务端的出于性能考虑,并不会立即删除过期的session数据。
- 可以手动
clearsessions
命令来手动清理过期的session。
request.session.set_expiry(value)
(4)清空session
delete()
:- 清除当前用户所在服务端的session数据
- 但是会保留session的键key
- 如果下次用户来访问时session没有被填充
- 那么返回的就是一个空的session对象
request.session.delete()
flush()
:- 完全删除当前用户的所有session对象和相关数据
- 包括服务端和客户端
request.session.flush()
(5)多值和多session
-
同一个用户创建多个数据
- 报错的只有一个sessionid
-
同一个计算机,同一个浏览器对应相同的sessionid
-
同一个计算机,不同浏览器对应不同的sessionid
-
当session过期时,可能出现多个sessionid对应同一个浏览器
- 但是过期的数据不会持久化存储,会被定时清理掉
- 目的是为了节省服务器资源
- 手动清理
clearsessions
命令
-
视图层
def get_session(request):res1 = request.session.get('sign')print(f"session第一个数据:{res1}")res2 = request.session.get("flag")print(f"session第一个数据:{res2}")return HttpResponse("获取session成功")def set_session(request):# session添加多个键值对,还是保存在一个sessionid中request.session['sign'] = "hello"request.session['flag'] = True# 十秒后自动清除客户端和服务端的session# request.session.set_expiry(10)# 关闭浏览器就清除# request.session.set_expiry(0)return HttpResponse("添加session成功")
【2】Django配置
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎其他公用设置项:
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
【3】示例
(1)页面跳转登录
- 和cookie的基本一样就是cookie改成session
def login_decorator(func):def inner(request, *args, **kwargs):next_url = request.get_full_path()if request.session.get("login_info"):res = func(request, *args, **kwargs)return resreturn redirect(f'/login/?next={next_url}')return innerdef login(request):# http://127.0.0.1:8000/login/?next=/func1/# 此时发送的是POST请求# 但是携带了get的内容if request.method == "POST":username = request.POST.get("username")password = request.POST.get("password")# 正常需要和数据库数据校验# 这里简单一点if username == "bruce" and password == "000":next_url = request.GET.get("next")next_url = next_url if next_url else '/home/'response = redirect(next_url)# response.sess("login_info", username + password)request.session['login_info'] = f"{username}-{password}"return responsereturn render(request, 'login.html', locals())
相关文章:

Django Cookie和Session
Django Cookie和Session 【一】介绍 【1】起因 HTTP协议四大特性 基于请求响应模式:客户端发送请求,服务端返回响应基于TCP/IP之上:作用于应用层之上的协议无状态:HTTP协议本身不保存客户端信息短链接:1.0默认使用短…...

【算法刷题 | 二叉树 04】3.27(翻转二叉树、对称二叉树、完全二叉树的节点个数、平衡二叉树、完全二叉树的所有路径)
文章目录 6.翻转二叉树6.1问题6.2解法一:递归6.2.1递归思路(1)确定递归函数的参数和返回值(2)确定终止条件(3)确定单层递归的逻辑 6.2.2全部代码 6.3解法二:层序遍历 7.对称二叉树7.…...

【uniapp】uniapp实现免密登录
文章目录 一、概要二、整体架构流程三、技术名词解释四 、技术细节1.存取token有效期?2.使用setStorageSync而不使用setStorage?3.使用onLaunch而不使用全局路由? 一、概要 打开一个网页或小程序的时候,我们有时候会自动进入主页…...

2024-03-27 问AI: 介绍一下深度学习中的 Darknet
文心一言 在深度学习中,Darknet是一个开源的神经网络框架,由Joseph Redmon开发,主要用于实现深度学习算法。它以其高效的实现和速度受到广泛关注,并在许多计算机视觉竞赛中取得了优异的结果。 Darknet的特点包括: 轻…...

POJ3037 + HDU-6714
两道最短路好题 POJ3037 手玩一下 发现每一点的速度可以直接搞出来,就是pow(2,h[1][1]-h[i][j])*V 那么从这个点出发到达别的点的耗费的时间都是上面这个数的倒数,然后直接跑最短路就好了 #include<iostream> #include<vector> #include<…...

Ubuntu搭建环境Cmake-Libtorch-Torchvision-PCL-VTK-OpenCV
Ubuntu搭建环境Cmake-Libtorch-Torchvision-PCL-VTK-OpenCV 安装Cmake安装libtorch安装torchvision安装PCL安装VTK安装OpenCV设置环境变量 仅供本人记录查阅使用 安装Cmake Cmake下载地址 解压 进入目录会看到只有 bin doc man share三个文件夹,没有 bootstrap文…...

分享多种mfc100u.dll丢失的解决方法(一键修复DLL丢失的方法)
在使用电脑过程中,我们经常会遇到一些陌生的DLL文件,例如mfc100u.dll。这些DLL文件是动态链接库(Dynamic Link Libraries)的缩写,它们包含了可以被多个程序共享的代码和数据。今天,我们将深入探讨mfc100u.d…...

Redis是单线程还是多线程?(面试题)
1、Redis5及之前是单线程版本 2、Redis6开始引入多线程版本(实际上是 单线程多线程 版本) Redis6及之前版本(单线程) Redis5及之前的版本使用的是 单线程,也就是说只有一个 worker队列,所有的读写操作都要…...

动态菜单设计
需求: 登录不同用户 显示不同的菜单 思路:根据用户id 左关联表 查询出对应的菜单选项 查询SQL select distinct-- 菜单表 去除重复记录sys_menu.id,sys_menu.parentId, sys_menu.name from -- 权限表sys_menu-- 角色与权限表 菜单表id 角色菜…...

Haproxy负载均衡介绍即部署
haproxy的原理: 提供高可用、负载均衡以及基于TCP(四层)和HTTP(七层)应用的代理,支持虚拟主机,开源可靠的一款软件。 适用于哪些负载特别大的web站点,这些站点通常又需要回话保持和七…...

基于大语言模型的云故障根因分析|顶会EuroSys24论文
*马明华 微软主管研究员 2021年CCF国际AIOps挑战赛程序委员会主席(第四届) 2021年博士毕业于清华大学,2020年在佐治亚理工学院做访问学者。主要研究方向是智能运维(AIOps)、软件可靠性。近年来在ICSE、FSE、ATC、EuroS…...

Windows直接运行python程序
Windows直接运行python程序 一、新建bat脚本二、新建vbs脚本 一、新建bat脚本 新建bat批处理脚本,写入以下内容 echo off call conda activate pytorch python app.pyecho off:在此语句后所有运行的命令都不显示命令行本身,但是本身的指令是…...

经典应用丨光伏行业扫码追溯新标杆,海康机器人AI智能读码器!
去年,光伏发电行业持续高速发展,我国仅在前九个月累计装机521.08GW,同比增长达到45.3%,已成为第二大电源类型超过水电。根据《2023中国与全球光伏发展白皮书》预测,到2030年,中国能够实现国家规划的风电和光…...

逆流而上的选择-积极生活,逆流而上
首先请大家看一个故事 李明坐在公司的开放式办公区,耳边是键盘敲击声的交响乐,眼前是一行行跳跃的代码。他的眼神有些恍惚,显示器的蓝光在他眼镜上反射出时代的光芒,这光芒既耀眼又刺眼。他即将35岁,在这个年纪&#x…...

SpringMVC基础Controller
文章目录 Controller 的编写和配置1. Controller 注解类型2. RequestMapping 注解类型3. 编写请求方法4. 请求参数和路径变量 Controller 的编写和配置 Controller 注解和 RequestMapping 注解是 Spring MVC 最重要的两个注解。 使用基于注解的控制器的优点如下: …...

spark 参数
spark.yarn.executor.memoryOverhead 默认值是384M Configuration - Spark 3.5.1 Documentation...

java调用jacob进行文件转换ppt转pdf或者png
java调用jacob进行文件转换ppt转pdf或者png 前情提要 最近项目上,遇到一个复杂的ppt,最终要求是要将ppt每一页转成图片原本这个是不难,网上一搜一大堆案例,外加我本身也比较精通aspose,那还不是分分钟搞定。结果就是…...

鸿蒙HarmonyOS应用开发之使用DevEco Studio模板构建NDK工程
NDK通过CMake和Ninja编译应用的C/C代码,编译过程如下图所示。 核心编译过程如下: 根据CMake配置脚本以及build-profile.json5中配置的externalNativeOptions构建参数,与缓存中的配置比对后,生成CMake命令并执行CMake。 执行Ninja…...

uniapp流浪动物救助小程序Java宠物领养小程序springboot
uniapp流浪动物救助小程序Java宠物领养小程序springboot 代码40块,需要的私聊 前台基于uniapp小程序 后台管理基于springbootvue前后端分离项目 开发语言:Java 框架:springboot vue JDK版本:JDK1.8(或11…...

工程企业的未来选择:Java版工程项目管理系统平台与数字化管理的融合
在现代化的工程项目管理中,一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统,结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…...

Vue使用el-statistic和el-card显示大屏中的统计数据
一、页面内容: <el-row :gutter"20"><el-col :span"6"><el-card class"box-card"><div><el-statisticgroup-separator",":precision"2":value"value2":title"tit…...

12.2024
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 7 15 16 28 29... 35 8 14 17 27 30... 4 9 13 18 26 31... 10 12 19 25 32... 11 20 24 33... 21 23 34.. 22 35... 容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少…...

【学习心得】Jupyter常用操作与魔法方法
一、安装与打开 Jupyter是什么我就不啰嗦了,直接安装: pip install jupyter 安装完后,在你想要打开的项目路径下,唤出CMD执行下面命令就可以使用jupyter notebook了 jupyter notebook 也可以用更加好用的jupyter lab࿰…...

Linux命令别名
别名是命令的快捷方式。对于需要经常执行,并需要很长时间输入的长命令创建快捷方式很有用。 临时修改 语法: alias 别名原命令 [选项] [参数][rootdd ~]# alias cdtcd /test #切换到/test下的快捷命令 删除别名: unalias 别名 unalias cd…...

Docker和 Containerd 的区别
自 Docker 开启了使用容器的爆发式增长,有越来越多的工具和标准来帮助管理和使用这项容器化技术,与此同时也造成了有很多术语让人感到困惑。 容器生态系统 容器生态系统是由许多令人兴奋的技术、大量的专业术语和大公司相互争斗组成的。 幸运的是&…...

Qt实现TFTP Server和 TFTP Client(二)
3 实现 3.1 Core Core模块包括下面4个类: TFTPBaseUdpTFtpClientFileTFtpServerFile 3.1.1 TFTP TFTP类实现了TFTP协议。 3.1.1.1 TFTP定义 class TFtp { public:TFtp();enum Code {RRQ 0x0001,//Read requestWRQ 0x0002,//Write requestDATA 0x0003…...

【b站李炎恢】Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢
课程地址:【Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢】 https://www.bilibili.com/video/BV1U54y127GB/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 备注:虽然标题声明还在更新中,但是看一些常用…...

AI大语言模型工程师学习路线
文章目录 运行LLMSLLM APIS开源的大语言模型Prompt engineering1. 明确目标2. 理解模型能力3. 使用示例4. 精确和具体的指令5. 考虑上下文6. 避免偏见和不准确的信息7. 测试和迭代8. 使用模板9. 考虑多语言能力10. 注意伦理和合规性结构化输出1. 使用明确的提示(Prompts)2. 采…...

基于树莓派实现 --- 智能家居
最效果展示 演示视频链接:基于树莓派实现的智能家居_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tr421n7BM/?spm_id_from333.999.0.0 (PS:房屋模型的搭建是靠纸板箱和淘宝买的家居模型,户型参考了留学时短租的公寓~&a…...

基于Arduino IDE 野火ESP8266模块 一键配网 的开发
一、配网介绍 ESP8266 一键配网(也称为 SmartConfig 或 FastConfig)是一种允许用户通过智能手机上的应用程序快速配置 ESP8266 Wi-Fi 模块的方法,而无需手动输入 SSID 和密码。为了实现这一功能,则需要一个支持 SmartConfig 的智能…...