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

Django系列教程(13)——Cookie和Session应用场景及案例

目录

什么是cookie,cookie的应用场景及缺点

Django中如何使用cookie

Cookie使用示例

什么是session及session的工作原理

Django中如何使用会话session

Session使用示例

小结


HTTP协议本身是”无状态”的,在一次请求和下一次请求之间没有任何状态保持,服务器无法识别来自同一用户的连续请求。有了cookie和session,服务器就可以利用它们记录客户端的访问状态了,这样用户就不用在每次访问不同页面都需要登录了。

什么是cookie,cookie的应用场景及缺点

cookie是一种数据存储技术, 它是将一段文本保存在客户端(浏览器或本地电脑)的一种技术,并且可以长时间的保存。当用户首次通过客户端访问服务器时,web服务器会发送给客户端的一小段信息。客户端浏览器会将这段信息以cookie形式保存在本地某个目录下的文件内。当客户端下次再发送请求时会自动将cookie也发送到服务器端,这样服务器端通过查验cookie内容就知道该客户端之前访问过了。

cookie的常见应用场景包括:

  • 判断用户是否已经登录
  • 记录用户登录信息(比如用户名,上次登录时间)
  • 记录用户搜索关键词

cookie的缺点在于其并不可靠和不安全,主要原因如下:

  • 浏览器不一定会保存服务器发来的cookie,用户可以通过设置选择是否禁用cookie。
  • cookie是有生命周期的(通过Expire设置),如果超过周期,cookie就会被清除。
  • HTTP数据通过明文发送,容易受到攻击,因此不能在cookie中存放敏感信息(比如信用卡号,密码等)。
  • cookie以文件形式存储在客户端,用户可以随意修改的。

Django中如何使用cookie

第一步:提供响应数据时设置cookie(保存到客户端)

response.set_cookie(cookie_name, value, max_age = None, expires = None) # key : cookie的名称
# value : 保存的cookie的值
# max_age: 保存的时间,以秒为单位
# expires: 过期时间,为datetime对象或时间字符串

例子: response.set_cookie('username','John',600)

注意:Django的视图默认返回的response是不包含cookie的,需手动调用set_cookie方法。

下面是3个设置cookie的例子:

# 例子1:不使用模板
response = HttpResponse("hello world")
response.set_cookie(key,value,max_age)
return response# 例子2: 使用模板
response = render(request,'xxx.html', context)
response.set_cookie(key,value,max_age)
return response# 例子3: 重定向
response = HttpResponseRedirect('/login/')
response.set_cookie(key,value,max_age)
return response

第二步: 获取COOKIES中的数据, 进行处理验证

# 方法一
request.COOKIES['username']# 方法二
request.COOKIES.get('username','')

客户端再次发送请求时,request会携带本地存储的cookie信息,视图中你可以通过request.COOKIES获取。

为了防止获取不能存在的Key报错,你可以通过如下方式检查一个cookie是否已存在。

request.COOKIES.has_key('cookie_name')

如果你希望删除某个cookie,你可以使用如下方法:

response.delete_cookie('username')

Cookie使用示例

下面是django中使用cookie验证用户是否已登录的一个示例。用户首次登录时设置cookie,再次请求时验证请求携带的cookie。

# 如果登录成功,设置cookie
def login(request):if request.method == 'POST':form = LoginForm(request.POST)if form.is_valid():username = form.cleaned_data['username']password = form.cleaned_data['password']user = User.objects.filter(username__exact=username, password__exact=password)if user:response = HttpResponseRedirect('/index/')# 将username写入浏览器cookie,有效时间为360秒response.set_cookie('username', username, 360)return responseelse:return HttpResponseRedirect('/login/')else:form = LoginForm()return render(request, 'users/login.html', {'form': form})# 通过cookie判断用户是否已登录
def index(request):# 读取客户端请求携带的cookie,如果不为空,表示为已登录帐号username = request.COOKIES.get('username', '')if not username:return HttpResponseRedirect('/login/')return render(request, 'index.html', {'username': username})

什么是session及session的工作原理

session又名会话,其功能与应用场景与cookie类似,用来存储少量的数据或信息。但由于数据存储在服务器上,而不是客户端上,所以比cookie更安全。不过当用户量非常大时,所有的会话信息都存储于服务器会对服务器造成一定的压力。

Django中如何使用会话session

第一步:检查基本设置

Django中使用session首选需要确保settings.py中已开启了SessionMiddleware中间件。

'django.contrib.sessions.middleware.SessionMiddleware',

Django默认使用数据库存储每个session的sessionid, 所以你还需确保INSTALLED_APPS 是包含如下app:

'django.contrib.sessions',

当然你还可以使用更快的文件或缓存来存储会话信息,可以通过SESSION_ENGINE设置就行。

第二步:使用session

request.session是一个字典,你可以在视图和模板中直接使用它。

# 设置session的值
request.session['key'] = value
request.session.set_expiry(time): 设置过期时间,0表示浏览器关闭则失效# 获取session的值
request.session.get('key',None)# 删除session的值, 如果key不存在会报错
del request.session['key']# 判断一个key是否在session里
'fav_color' in request.session# 获取所有session的key和value
request.session.keys()
request.session.values()
request.session.items()

另外,settings.py 还有两项有关session比较重要的设置: 1、SESSION_COOKIE_AGE:以秒为单位,session的有效时间,可以通过set_expiry 方法覆盖。 2、SESSION_EXPIRE_AT_BROWSER_CLOSE:默认为Flase,是否设置为浏览器关闭,会话自动失效。

Session使用示例

下面是django中使用session进行用户登录和登出的一个示例。用户首次登录时设置session,退出登录时删除session。

# 如果登录成功,设置session
def login(request):if request.method == 'POST':form = LoginForm(request.POST)if form.is_valid():username = form.cleaned_data['username']password = form.cleaned_data['password']user = User.objects.filter(username__exact=username, password__exact=password)if user:# 将username写入session,存入服务器request.session['username'] = usernamereturn HttpResponseRedirect('/index/')else:return HttpResponseRedirect('/login/')else:form = LoginForm()return render(request, 'users/login.html', {'form': form})# 通过session判断用户是否已登录
def index(request):# 获取session中usernameusername = request.session.get('username', '')if not username:return HttpResponseRedirect('/login/')return render(request, 'index.html', {'username': username})# 退出登录
def logout(request):try:del request.session['username']except KeyError:passreturn HttpResponse("You're logged out.")

下面是通过session控制不让用户连续评论两次的例子。实际应用中我们还可以通过session来控制用户登录时间,记录访问历史,记录购物车信息等等。

from django.http import HttpResponsedef post_comment(request, new_comment):if request.session.get('has_commented', False):return HttpResponse("You've already commented.")c = comments.Comment(comment=new_comment)c.save()request.session['has_commented'] = Truereturn HttpResponse('Thanks for your comment!')

小结

cookie和session都是一种存储少量数据的技术,用来记录客户端的访问状态,区别在于一个存储在客户端,一个存储在服务器端。Django中使用cookie和session都非常方便,都是基于先设置再获取的原则,可以灵活地用于各个场景。

相关文章:

Django系列教程(13)——Cookie和Session应用场景及案例

目录 什么是cookie,cookie的应用场景及缺点 Django中如何使用cookie Cookie使用示例 什么是session及session的工作原理 Django中如何使用会话session Session使用示例 小结 HTTP协议本身是”无状态”的,在一次请求和下一次请求之间没有任何状态保…...

element-ui pagination 组件源码分享

pagination 分页组件源码分享,主要从以下三个方面: 1、pagination 组件页面结构。 2、pagination 组件属性。 3、pagination 组件方法。 一、组件页面结构。 二、组件属性。 2.1 small 是否使用小型分页样式,类型为 boolean,…...

【css酷炫效果】纯CSS实现火焰文字特效

【css酷炫效果】纯CSS实现火焰文字特效 缘创作背景html结构css样式完整代码基础版进阶版(冰霜版) 效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492005 缘 创作随缘,不定时更新。 创作背景 刚…...

【java面型对象进阶】------继承实例

继承结构下的标准Javabean 代码如下: package demo10;//定义员工父类 public class Employee {private String id;private String name;private double salary;//构造方法public Employee(){}public Employee(String id,String name,double salary){this.idid;thi…...

Oracle 19c 子分区表索引测试

一、建表语句放在最后,方便查看 二、创建各类索引 --创建本地的主键约束,但必须加上分区键、子分区键MT_O_CODE,M_YMD alter table MS_DMG.A_RED drop constraint MGR_PK_AREAD ; alter table MS_DMG.A_RED add constraint MGR_PK_AREAD primary key …...

【数据分享】1999—2023年地级市固定资产投资和对外经济贸易数据(Shp/Excel格式)

在之前的文章中,我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据、房地产投资情况和商品房销售面积相关指标数据、社会消费品零售总额和年末金融机构存贷款余额、各类用地面积、地方一般公共预算…...

Spring Boot 与 Couchbase 整合教程

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 与 Couchbase 整合教程 环境要求 JDK 8Spring Boot 2.7.xCouchbase Server 7.xMaven/Gradle 步骤 1:创建Spring Boot项目 使用 st…...

数据结构——串、数组和广义表

串、数组和广义表 1. 串 1.1 串的定义 串(string)是由零个或多个字符组成的有限序列。一般记为 S a 1 a 2 . . . a n ( n ≥ 0 ) Sa_1a_2...a_n(n\geq0) Sa1​a2​...an​(n≥0) 其中,S是串名,单引号括起来的字符序列是串的值, a i a_i a…...

Spring中DI与IOC的关系解析

在Spring框架中,DI(依赖注入)和IOC(控制反转)是两个核心概念,它们密切相关但有不同的侧重点。 IOC(控制反转) IoC 是一种设计原则,将对象的创建和依赖管理交给框架或容…...

pycharm-python國際象棋遊戲代碼

嗯,用户的问题是“pycharm寫關於python國際象棋遊戲代碼”,也就是要用PyCharm来写一个Python的国际象棋游戏代码。我需要先整理一下用户提供的搜索结果,看看有什么相关的信息可以利用。 首先看搜索结果中的各个网页内容。网页1主要讲的是象棋…...

【Java代码审计 | 第十四篇】MVC模型、项目结构、依赖管理及配置文件概念详解

未经许可,不得转载。 文章目录 MVC模型模型(Model)视图(View)控制器(controller)MVC工作流程 项目结构java目录resources目录webapp目录 依赖管理配置文件 MVC模型 MVC(Model-View-…...

单片机ADC+NTC温度采集电路学习

文章目录 前言一、NTC是什么?二、NTC重要参数三、实际应用举例四、NTC和PTC的区别总结 前言 NTC常用来检测外部环境或者电池温度,及汽车水温传感器。 有时候电池并不内置NTC,所以需要外置NTC来采集电池温度,注意要紧贴电池&#…...

【Spring Boot 中 `@Value` 注解的使用】

文章目录 一、前言二、Value 注解简介三、Value 注解的常见用法1. 读取 application.properties 或 application.yml 配置值(1)配置文件示例(2)Java 代码示例(3)测试输出 2. 使用 Value 设置默认值3. 读取系…...

分布式数据库系统(DDBS)

分布式数据库系统(DDBS) (Distributed Database System)的概念及其特点: 分布式数据库系统是一种数据库系统,它将数据分散存储在多个地理上分散的节点上,通过一个全局数据库管理系统(DBMS)来协调…...

2025年,电脑还需要分区吗?

随着2025年的到来,电脑存储空间已经不像以前那么金贵,固态硬盘(SSD)容量更大、速度更快,云存储也成了日常标配。许多人开始质疑:电脑还需要像以前那样分区吗? 一、分区到底是什么意思&#xff…...

一个成功的Git分支模型

本作品原发布账号为【白鸽子中文网】,现转至当前账号【飞翔中文网】。 反思备录(2020/3/5) 这个模型构思于2010年,现已过去10余年,(2010年)那时正处于Git诞生后不久。在这10年间,git-flow(本文中提到的分支模型) 在许多软件队伍里…...

Kafka可视化工具KafkaTool工具的使用

Kafka Tool工具 介绍 使用Kafka的小伙伴,有没有为无法直观地查看 Kafka 的 Topic 里的内容而发过愁呢?下面推荐给大家一款带有可视化页面的Kafka工具:Kafka Tool (目前最新版本是 3.0.2) 注意:以前叫Kafk…...

【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目

目录 1. 功能需求2. Python基础2.1 特点2.2 Python基础知识2.3 dict嵌套简单说明 3. C语言调用Python3.1 搭建编译环境3.2 直接调用python语句3.3 调用无参python函数3.4 调用有参python函数 4. 阿里云垃圾识别方案4.1 接入阿里云4.2 C语言调用阿里云Python接口 5. 香橙派使用摄…...

同等学力申硕-计算机专业-数学基础-历年真题和答案解析

同等学力申请硕士学位考试是比较适合在职人员的提升学位方式,了解过的人应该都知道,现在社会的竞争压力越来越大,为了提高职业生存能力,提升学位在所难免。 为了通过同等学力申请硕士学位考试,对于计算机专业的人来说…...

网络安全漏洞与修复 网络安全软件漏洞

文章目录 一、软件漏洞的概念 1、信息安全漏洞简述2、软件漏洞3、软件漏洞概念4、软件漏洞的成因分析 二、软件漏洞标准化管理 1、软件漏洞分类2、软件漏洞分级3、安全漏洞管理规范 一、软件漏洞的概念 1、信息安全漏洞简述 信息安全漏洞是信息安风险的主要根源之一&…...

STM32:Default_Handler问题

记录代码进入Default_Handler错误的解决办法 一、 问题表述 在一次调试代码的时候,发现代码卡死在启动文件 startup_at32f423xx_.s 的367行,即 B. 处B.是汇编代码,B:跳转到一个标号,这里跳转到一个‘.’,…...

iwebsec-SQL数字型注入

1.判断是否存在漏洞 添加and 11发现正常显示,添加and 12无回显条目,则存在sql注入漏洞 2.因为有回显,尝试union联合注入,使用order by判断出有3个字段 3.使用union联合注入查看回显位,发现3三个字段均有回显&#xff…...

基于Spring Boot的冷链物流系统的设计与实现的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

LLM(6):理解词嵌入

深度神经网络模型,包括 LLM,无法直接处理原始文本。由于文本是分类的,它与用于实现和训练神经网络的数学操作不兼容。因此,我们需要一种方法来将词语表示为连续值向量。 注意:如果读者对向量和张量不太了解&#xff0c…...

SQLMesh系列教程:利用date_spine宏构建日期序列实践指南

引言:为什么需要日期维度表? 在数据分析和报表开发中,日期维度表是不可或缺的基础结构,其中包括一定日期范围的日期序列,每个序列包括对应日期属性,如年季月日、是否周末等。无论是计算日粒度销售额、分析…...

sqlite mmap

https://www.sqlite.org/mmap.html 1. 内存映射 I/O 的基本原理 默认机制(传统 I/O) SQLite 默认通过 xRead() 和 xWrite() 方法(对应 read()/write() 系统调用)访问数据库文件。这些方法需要将数据从内核缓冲区复制到用户空间&am…...

Java 大视界 -- 企业数字化转型中的 Java 大数据战略与实践(93)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

Unity Enlighten与Progressive GPU Lightmapper对比分析

一、技术背景与核心差异 1. 算法原理 Enlighten 基于辐射度算法(Radiosity),通过将场景分解为Systems(光照关联单元)和Clusters(计算单元),预计算光照环境中的间接光传输。其核心是…...

linux:环境变量,进程地址空间

一.命令行参数 main的参数:int argc,char*argv[],char*env[] 1.参数意义: argc是命令行调用次程序时传递的参数 例: ls -l -a 传递了三个参数,“ls" "-l" "-a"三个字符串 argv是传递的参…...

mybatis集合映射association与collection

官方文档&#xff1a;MyBatis的一对多关联关系 一、用途 一对一&#xff1a;association 一对多&#xff1a;collection 二、association 比较容易理解&#xff0c;可参考官方文档 三、collection <?xml version"1.0" encoding"UTF-8"?> &l…...