当前位置: 首页 > news >正文

Django(九、cookie与session)

文章目录

  • 一、cookie与session的介绍
            • HTTP四大特性
      • cookie
      • session
  • Django操作cookie
      • 三板斧
      • 基于cookie的登录功能
            • set_cookie 设置cookie
      • 清空cookie
      • 设置cookie参数
      • Django操作session
            • 设置session
            • 获取session
            • 清空session
            • session相关的参数
            • 设置过期时间
      • CBV添加装饰器

一、cookie与session的介绍

在讲之前我们先来回忆一下HTTP的四大特性

HTTP四大特性

1.基于请求响应
2.基于TIC、IP作用于应用层上的协议
3.无状态
          保存客户端的装态
4.无连接

这篇文章要讲的就是跟“无状态”有关

最开始所有的网站都不需要用户注册登录,所有人来访问到的数据都是一样的

但是随着互联网的发展很多网站需要知道当前用户的状态

在这里插入图片描述

cookie

保存在客户端,与用户状态相关的信息,这种信息都可以叫做cookie
最开始的cookie非常的不安全

session

保存在服务端,与用户状态相关的信息,session依赖于cookie工作

在这里插入图片描述
当然也可以不保存cookie,在浏览器里设置阻止所有cookie,当你设置了以后,所有需要登录的网页都会登录不上去。

原理就是用户登录以后,所有的相关信息都需要经过cookie,服务器需要返回一些数据给cookie,但是你的cookie被你关掉了,就不会验证,也就是令牌没有作用了,所以不简易阻止所有cookie

Django操作cookie

在Django中如何是用cookie

三板斧

return HttpResponse  返回字符串
return render  返回网页
return redirect  重定向obj = HttpResponse 
return objobj = render
return objobj = redirect
return obj
操作cookie的时候,就用到了这个obj对象

基于cookie的登录功能

首先我们做一个简单的登录页面功能,需要创建一个数据库,从数据库匹配账户密码

models.py 创建数据库,创建完别忘了做数据迁移

class Userinfo(models.Model):name = models.CharField(max_length=32)password = models.IntegerField()

tests.py 创建一些数据出来

import os
import sysif __name__ == '__main__':os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day10.settings')import djangodjango.setup()from app01 import modelsbulk_list = []for i in range(10000):user_obj = models.Userinfo(name=f'kevin{i}', password=f"{i}")bulk_list.append(user_obj)models.Userinfo.objects.bulk_create(bulk_list)
set_cookie 设置cookie

views.py 登录功能

def login(request):if request.method == 'POST':print(request.POST)username = request.POST.get('username')  # 这里取到的是前端name的键password = request.POST.get('password')userinfo = models.Userinfo.objects.all()  # 查询数据库的得到userinfo对象for i in userinfo:  # 循环数据库里的数据if username == i.name and password == str(i.password):  # 判断数据是否匹配print('登录成功')obj = redirect('/index/')  # 先实例化对象登录成功跳转页面obj.set_cookie('username', i.name, max_age=60)  # 让浏览器记录当前登录状态,max_age=60这条记录只保存60秒,60秒后删除return obj  # 登录成功跳转页面else:return HttpResponse("密码错误")return render(request, 'login.html')

login.html

<body>
<form action="" method="post">用户名<input type="text" name="username">密码<input type="password" name="password"><input type="submit">
</form>
</body>

这样一个简单的登录功能就创建出来了,这个我们就可以在浏览器里看到cookie已经保存了一些数据
在这里插入图片描述
还可以做一个登录验证功能,登录之后才能看到内容,这里用到了装饰器

views.py

def login_auth(func):def inner(*args, **kwargs):  # 这里就已经接收到了request参数request = args[0]  # 将request从args中索引取值出来if request.COOKIES.get('username'):  # 如果cookies有值就不用再登陆return func(*args, **kwargs)else:                              # 否则需要登录验证return redirect('/login/')   # 跳转到登录页面return inner@login_auth  # 添加登录功能装饰器
def index(request):if request.is_ajax():myfile = request.FILES.get('myfile')import osdir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 获取当前文件所在路径with open(dir_path + '/static/' + myfile.name, 'wb') as f:  # 将文件写到static文件夹下for i in myfile:f.write(i)return render(request, 'index.html', locals())

清空cookie

obj.delete_cookie('username')

使用场景:退出登录、注销

设置cookie参数

obj.set_cookie('username', i.name, max_age=60)

上面我们用到了三种参数分别是

● key, 键

● value=’’, 值

● max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止

还有其他的一些参数
● expires=None, 超时时间(IE requires expires, so set it if hasn’t been already.),兼容IE浏览器可以在同时设置两种,这样兼容了所有浏览器

● path=’/‘, Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。

● domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如, domain=”.example.com”所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只能由设置它的站点读取

● secure=False, 浏览器将通过HTTPS来回传cookie

● httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

Django操作session

session的数据是保存在后端,保存在后端的载体其实有很多种,比如:可以把数据保存在数据库、文件、Redis等

Django的默认保存位置在数据库中,在django_session表中

设置session

成功设置一个seesion值有什么变化:

  1. 会生成一个随机字符串
def set_session(request):![在这里插入图片描述](https://img-blog.csdnimg.cn/6bf1fb0033c44743a9713cd90627c514.png)request.session['username'] = 'kevin1'return HttpResponse('set_session')

在这里插入图片描述
2. 会把用户设置的信息保存到django_session中,数据也做了加密处理
在这里插入图片描述
3. 把数据封装到了request.session里去了

  1. Django后端把随机字符串保存到浏览器中
  2. 后端的随机字符串中的也保存在浏览器中key=sessionid

这个是候我们再多设置一个值的时候,session_key是不变的,变的是session_data,在别的浏览器打开的是候,会多增加一条,但是一个浏览器只对应一条,这样做的好处可以节省MySQL数据空间

获取session
def get_session(request):print(request.session.get('username'))  #kevin1, 直接通过点语法获取return HttpResponse('get_session')

获取session的时候发生了哪些事

  1. 浏览器先把sessionid回传到Django的后端

  2. Django后端获取到了sessionid,然后去数据表中根据session_key查询
    如果查到了,就说明之前已经登录过
    如果查不到,就返回None

  3. 查询出来的数据默认是加密的,Django后端又把数据解密之后封装到request.session中
    在取session值的时候,就从request.session中取

  4. session的过期时间默认是14天

清空session
request.session.delete()  # 清空session,只删除服务端的数据,不删除浏览器的
request.session.flush()  # 清空前后端的session数据
session相关的参数
request.session.values()  # 拿出所有的value值
request.session.keys()  # 拿出所有的key值
request.session.items()  # 拿出所有的key值和value值
设置过期时间
request.session.set_expiry(value)

如果value是个整数,session会在这些秒数后失效
如果value是个datatime或timedelta,session就会在这个时间后失效。
如果value是0,用户关闭浏览器session就会失效
如果value是None,session会依赖全局session失效策略

CBV添加装饰器

现在我给CBV添加一个登录验证,有三种方法

第一种

from django.utils.decorators import method_decorator@method_decorator(login_auth, name='get')
@method_decorator(login_auth, name='post')
class L_login(View):def get(self, *args, **kwargs):return HttpResponse('get')def post(self, *args, **kwargs):return HttpResponse('post')

第二种

from django.utils.decorators import method_decoratorclass L_login(View):@method_decorator(login_auth)def get(self, *args, **kwargs):return HttpResponse('get')@method_decorator(login_auth)def post(self, *args, **kwargs):return HttpResponse('post')

第三种

from django.utils.decorators import method_decoratorclass L_login(View):@method_decorator(login_auth)  # 加载dispatch上的装饰器会对下面的所有方法起作用def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get')def post(self, request):return HttpResponse('post')

一般第一种和第二种用的比较多

相关文章:

Django(九、cookie与session)

文章目录 一、cookie与session的介绍HTTP四大特性 cookiesession Django操作cookie三板斧基于cookie的登录功能set_cookie 设置cookie 清空cookie设置cookie参数Django操作session设置session获取session清空sessionsession相关的参数设置过期时间 CBV添加装饰器 一、cookie与s…...

web前端之若依框架图标对照表、node获取文件夹中的文件名,并通过数组返回文件名、在html文件中引入.svg文件、require、icon

MENU 前言效果图htmlJavaScripstylenode获取文件夹中的文件名 前言 需要把若依原有的icon的svg文件拿到哦&#xff01; 注意看生成svg的路径。 效果图 html <div id"idSvg" class"svg_box"></div>JavaScrip let listSvg [404, bug, build, …...

使用 goland 开发 golang 项目环境配置

方式1&#xff1a;使用 GOPATH 和 GOROOT 在 goland 中打开&#xff1a;Settings - Go&#xff0c;会看到 GOROOT、GOPATH&#xff0c;其相关解释与配置如下&#xff1a; GOROOT&#xff1a;对应 go 的安装路径&#xff0c;例如&#xff1a;D:\go\binGOPATH&#xff1a;是我们…...

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问

Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 &#x1f4f7; 江池…...

[git] 忽略已经提交的文件或文件夹

文件已经被Git跟踪 如果某个文件已经被Git跟踪过&#xff08;即已经添加到版本控制中&#xff09;&#xff0c;.gitignore文件对该文件将不起作用。您需要使用以下命令将该文件从Git中移除&#xff1a; git rm --cached <文件> 支持文件夹 -r <文件夹>...

大模型增量预训练参数说明

在增量预训练过程中通常需要设置三类或四类参数,模型参数,数据参数,训练参数,额外参数。 下面分别针对这四种参数进行说明。 欢迎关注公众号 模型参数 model_type模型类型,例如bloom,llama,baichuan,qwen等。 model_name_or_path模型名称或者路径。 tokenizer_name_or…...

成为AI产品经理——模型评估概述

目录 一、模型宣讲和评估的原因 二、模型宣讲 三、模型评估 1. 重要特征 ① 特征来源 ②特征意义 2.选择测试样本 3.模型性能和稳定性 一、模型宣讲和评估的原因 刘海丰老师提到他们在做一个金融AI产品未注重模型指标&#xff0c;过于注重业务指标&#xff0c;导致产生…...

内存屏障与JVM指令

内存屏障是一种同步原语&#xff0c;用于确保在并发程序中&#xff0c;当一个线程对内存中的数据进行修改后&#xff0c;其他线程可以及时地获取到最新的数据。 内存屏障可以确保指令的执行具有原子性、可见性和顺序性。在JVM中&#xff0c;内存屏障通常通过插入一段特殊的指令…...

深入理解JVM 类加载机制

深入理解JVM 类加载机制 虚拟机如何加载Class文件&#xff1f; Class文件中的信息进入到虚拟机后会发生什么变化&#xff1f; 类加载机制就是Java虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机…...

SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡

目录 一&#xff1a;Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现 二&#xff1a;Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 tips&#xff1a;前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗…...

SpringSecurity+JWT权限认证

SpringSecurity默认的是采用Session来判断请求的用户是否登录的&#xff0c;但是不方便分布式的扩展 虽然SpringSecurity也支持采用SpringSession来管理分布式下的用户状态&#xff0c;不过现在分布式的还是无状态的Jwt比较主流 一、创建SpringBoot的项目 spring-boot-starte…...

Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式

HTTP协议是“请求-响应”模式&#xff0c;浏览器必须先发请求给服务器&#xff0c;服务器才会响应该请求。即服务器不会主动发送数据给浏览器。 实时性要求高的应用&#xff0c;如在线游戏、股票实时报价和在线协同编辑等&#xff0c;浏览器需实时显示服务器的最新数据&#x…...

安全框架springSecurity+Jwt+Vue-2(后端开发)

一、创建项目及配置 ①&#xff1a;创建新的项目及常用包 ②&#xff1a;引入依赖和配置 devtools&#xff1a;项目的热加载重启插件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&…...

6.1.webrc媒体协商

那今天呢&#xff1f;我们来看一下y8 rtc的媒体协商&#xff0c;那实际上在我们之前的课程中呢&#xff1f;我已经向你介绍过y8 rtc的媒体协商了。只不过呢&#xff0c;角度是不一样的&#xff0c;在之前介绍外边tc媒体协商的时候呢&#xff0c;我们是从应用的角度来看。那web …...

Android WebView中打开外部超链接无反应

什么是外部超链接&#xff1f; 相当于是跳转到一个新的网址页面 解决方案选择&#xff1a; 1.在WebView内部中打开外部超链接 设置setSupportMultipleWindows为false即可 webView.settings.setSupportMultipleWindows(false)2.打开系统浏览器打开新页面 设置setSupportMul…...

JMeter集结点的使用场景以及如何使用?

JMeter是一个开源的负载测试工具&#xff0c;它被广泛用于测试应用程序、Web服务和网络协议等的性能。在JMeter中&#xff0c;集结点&#xff08;JMeter Cluster&#xff09;是一种分布式测试环境&#xff0c;它允许多个JMeter实例同时工作来模拟高并发负载。 使用集结点的场景…...

2023最新面试题

第一家 自我介绍介绍一下最近一个&#xff08;最熟悉的一个&#xff09;项目 项目几个人在负责 项目实际在用了吗&#xff0c;哪个平台在用啊&#xff08;在哪里上线&#xff09; 你认为你自己做的项目里面哪个比较难做呢&#xff0c;项目里面有什么难点&#xff1f;常用的是V…...

shell 脚本的函数和数组

函数 —— 封装的一个公式&#xff1a;sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块&#xff0c;在函数中写执行的命令即可&#xff1b;使用函数可以避免代码重复&#xff0c;增加可读性&#xff0c;简化脚本&#xff0c;使用函数可以将大的工程分割为若…...

【RocketMq系列-02】RocketMq的架构解析和高性能设计

RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709【二】RocketMq的架构解析和高性能设计/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514 RocketMq的架构解析和高性能设…...

【数据结构/C++】线性表_单链表的基本操作

#include <iostream> using namespace std; // 2. 单链表 // ElemType 的定义 typedef int ElemType; typedef struct LNode {ElemType data;struct LNode *next; } LNode, *LinkList; // 初始化单链表 bool InitList(LinkList &L) {L (LNode *)malloc(sizeof(LNode…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...