Django Cookie和Session

Django Cookie和Session

【一】介绍

【1】起因

  • HTTP协议四大特性
    1. 基于请求响应模式:客户端发送请求,服务端返回响应
    2. 基于TCP/IP之上:作用于应用层之上的协议
    3. 无状态:HTTP协议本身不保存客户端信息
    4. 短链接: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:主界面
    • func1func2功能界面
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

  • 内部执行过程
    1. 产生一个随机字符串
    2. 保存随机字符串和加密数据
    3. 最后将随机字符串返回给浏览器,存储在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())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chronos: 将时间序列作为一种语言进行学习

这是一篇非常有意思的论文&#xff0c;它将时间序列分块并作为语言模型中的一个token来进行学习&#xff0c;并且得到了很好的效果。 Chronos是一个对时间序列数据的概率模型进行预训练的框架&#xff0c;它将这些值标记为与基于transformer的模型(如T5)一起使用。模型将序列的…

ActiveMQ Artemis 系列| High Availability 主备模式(消息复制) 版本2.19.1

一、ActiveMQ Artemis 介绍 Apache ActiveMQ Artemis 是一个高性能的开源消息代理&#xff0c;它完全符合 Java Message Service (JMS) 2.0 规范&#xff0c;并支持多种通信协议&#xff0c;包括 AMQP、MQTT、STOMP 和 OpenWire 等。ActiveMQ Artemis 由 Apache Software Foun…

C++ ——数组介绍和实例

文章目录 **定义数组****初始化数组****访问数组元素****一维数组与多维数组****数组与指针****数组的局限性****现代C中的替代方案** 以下是一个C程序实例&#xff0c;演示了如何定义、初始化、访问一维数组以及使用循环遍历数组&#xff1a; C ——数组 C 中的“数组”是一种…

vue2项目设置浏览器标题title及图标logo

工作中肯定会遇到要修改网页的标题title及图标logo 一、固定设置标题方案 方法一&#xff1a;在vue.config.js文件&#xff0c;添加如下代码&#xff1a; chainWebpack: config > {// 配置网页标题config.plugin(html).tap((args) > {args[0].title 标题return args})…

[TS面试]keyof和typeof关键字作用?

keyof和typeof关键字作用? keyof 索引类型查询操作符, 获取索引类型属性名, 构成联合类型 typeof 获取一个变量或者对象的类型 let str:string ‘hello’ // typeof str >:string keyof typeof 获取 联合类型的key enum A{A, B, C }type unionType keyof typeof A; /…

数字身份的革命:解锁 Web3 的身份验证技术

引言 随着数字化时代的到来&#xff0c;个人身份认证成为了日常生活和商业活动中不可或缺的一部分。传统的身份验证方式存在着安全性低、易伪造、不便利等问题&#xff0c;因此&#xff0c;人们迫切需要一种更安全、更便捷的身份验证技术。在这样的背景下&#xff0c;Web3的身…

macos下 jupyter服务安装和vscode链接密码设置 .ipynb文件

最近收到了一些后缀为.ipynb的文件&#xff0c; 这个文件就是使用jupyter编辑的&#xff0c;于是就需要安装一个jupyter服务&#xff0c; 对于最新版本的jupyter 网上很多的资料都已经过期了&#xff0c;这里以最新版本的jupyter为例。 jupyter lab安装 jupyter 这个工具包含…

微软正在改进其AI驱动的Copilot在Microsoft Teams中的工作方式,为会议聊天、总结等引入了新的召唤助手方式

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

CUDA安装 Windows版

目录 一、说明 二、安装工具下载 三、CUDA安装 四、cuDNN配置 五、验证安装是否成功 一、说明 windows10 版本安装 CUDA &#xff0c;首先需要下载两个安装包 CUDA toolkitcuDNN 官方教程 CUDA&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-micro…

校园app开发流程-uniapp开发-支持APP小程序H5-源码交付-跑腿-二手市场-交友论坛等功能,学校自由选择!

随着科技的不断发展&#xff0c;智慧校园系统和跑腿外卖小程序已经成为当今社会的热门话题。作为未来的重要趋势之一&#xff0c;科技在教育领域中的应用越来越广泛。本文将探讨智慧校园系统和跑腿外卖小程序的开发过程&#xff0c;并阐述如何利用科技“育”见未来 一、智慧校…

接口自动化之 + Jenkins + Allure报告生成 + 企微消息通知推送

接口自动化之 Jenkins Allure报告生成 企微消息通知推送 在jenkins上部署好项目&#xff0c;构建成功后&#xff0c;希望可以把生成的报告&#xff0c;以及结果统计发送至企微。 效果图&#xff1a; 实现如下。 1、生成allure报告 a. 首先在Jenkins插件管理中&#x…

LVS负载均衡-DR模式配置

LVS&#xff1a;Linux virtual server ,即Linux虚拟服务器 LVS自身是一个负载均衡器&#xff08;Director&#xff09;&#xff0c;不直接处理请求&#xff0c;而是将请求转发至位于它后端的真实服务器real server上。 LVS是四层&#xff08;传输层 tcp/udp&#xff09;负载均衡…

11.Notepad++

文章目录 一、下载和安装设置练习 以前在记事本上写的代码看上去有点累&#xff0c;因为所有的单词看上去都是黑色的&#xff0c;并且当代码出现问题后&#xff0c;它提示第三行&#xff0c;我们还需要一行一行去数。这些问题都可以由一个高级记事本&#xff1a; Notepad 来解…

Windows直接运行python程序

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

第二篇:3.1 广告印象(AD Impression) - IAB与MRC及《增强现实广告效果测量指南1.0》

--- 我为什么要翻译美国IAB科技公司系列标准 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见度 …

前端埋点全解及埋点SDK实现方式

一、什么是埋点 所谓“埋点”&#xff0c;是数据采集领域&#xff08;尤其是用户行为数据采集领域&#xff09;的术语&#xff0c;指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等。 埋点…

什么是物联网监控平台?部署物联网平台有什么作用?

随着物联网技术的飞速发展&#xff0c;越来越多的企业开始关注并投入到这一领域。物联网监控平台作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为企业数字化转型的关键组件。今天&#xff0c;我们将深入探讨物联网监控平台的定义、部署物联网平台的作用&#xff0c;以…

linux环境gitlab迁移到新服务器

目录 备份项目备份gitlab配置阿里云磁盘格式化准备 最近服务器中了挖矿病毒&#xff0c;清理几次&#xff0c;都没有搞定&#xff0c;只能重新安装gitlab 备份项目 先把项目备份到本地 git pull git remote prune origin确保本地代码是最新的并且拥有所有的分支 git remote …

蓝桥杯-网络安全比赛(2)基础学习-正则表达式匹配电话号码、HTTP网址、IP地址、密码校验

正则表达式&#xff08;Regular Expression&#xff09;&#xff1a;定义&#xff1a;一种强大的文本处理工具&#xff0c;用于描述、匹配和查找字符串中的特定模式。应用&#xff1a;密码验证、文本搜索和替换、数据清洗等。特点&#xff1a;通过特定的元字符和规则来构建复杂…

逆向案例9--小鹅通视频m3u8内容解密--含简单webpack

视频网址&#xff1a;https://app4nseessp8638.h5.xiaoeknow.com/v2/course/alive/l_65b9e8dfe4b064a83b90e102?type2&app_idapp4nseessp8638&channel_id&res_type4&pro_id&res_idl_65b9e8dfe4b064a83b90e102 按照惯例&#xff0c;刷新网站&#xff0c;搜…