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实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...