Django——中间件
Django——中间件
中间件可以介入 Django 的请求和响应的处理过程,修改 Django 的响应数据。中间件的设计为程序开发者提供了一种无侵入式的开发方式,增强 Django 框架的健壮性。
中间件可以在 Django 处理视图的不同阶段的干预。
Django 框架中原先内置的一些中间件
MIDDLEWARE = [# 主要对安全性访问处理请求,把 http 请求重定向为 https 请求'django.middleware.security.SecurityMiddleware',# 会话支持'django.contrib.sessions.middleware.SessionMiddleware',# 检查是否允许浏览器访问类型 , 检查 url 是否需要添加 /'django.middleware.common.CommonMiddleware',# 跨站点防御保护'django.middleware.csrf.CsrfViewMiddleware',# 用户认证'django.contrib.auth.middleware.AuthenticationMiddleware',# Cookie 会话支持'django.contrib.messages.middleware.MessageMiddleware',# 点击劫持保护'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
1、项目启动的时候
2、请求进来的时候需要经过中间件之后才能到后续的路由匹配操作
3、响应到浏览器的时候需要经过中间件
1、认证登录
2、统计访问流量
3、拦截请求:可以限制IP的请求频率或者直接封禁IP
中间件的执行顺序
在请求处理之前,中间件根绝配置文件中的配置列表从上往下依次执行;
在请求处理之后,中间件根绝配置文件中的配置列表从下往上依次执行;
1、自定义中间件
定义一个中间件工厂函数,返回一个可以被调用的中间件(闭包)。
中间件的工厂函数必须接收一个可以被调用的 get_response 对象,请求处理。
def simple_middleware(get_response):# 这里编写的代码只在 Django 项目启动的时候被执行def middleware(request):'''request : 和我们写的视图函数接收的request数据一致,都是浏览器的请求数据'''# 这里编写的代码,是在请求处理之前被执行response = get_response(request)# 这里编写的代码,是在请求处理之后被执行return responsereturn middleware
在应用下新建一个 middleware.py 文件
def simple_middleware(get_response):# 这里编写的代码只在 Django 项目启动的时候被执行print('初始化 Django')def middleware(request):'''request : 和我们写的视图函数接收的request数据一致,都是浏览器的请求数据'''# 这里编写的代码,是在请求处理之前被执行print('request 请求被处理之前')response = get_response(request)# 这里编写的代码,是在请求处理之后被执行print('request 请求被处理之后')return responsereturn middleware
定义好中间件之后,需要到配置文件中的 MIDDLEWARE 列表中添加自定义的中间件路径
# 自定义中间件注册
'MiddlewareApp.middleware.simple_middleware',
2、自定义中间件类
自定义中间件类需要继承 MiddlewareMixin
process_request 方法 , 是 Request 预处理函数;这个方法就是在请求处理之前被调用
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass MyMiddleware(MiddlewareMixin):def process_request(self , request):# request : 用户请求的数据# 可以没有返回值:None 中间件就会按照正常的流程执行, 如果配置列表后面还有中间就进入下一个中间件,# 否则则进入 url 请求匹配print('process_request 预处理函数')# 有返回值:HttpResponse 对象,就不执行处理其他的中间件,以及不进行 url 匹配,这里整个请求停止# 将这里返回的 HttpResponse 对象响应给浏览器return HttpResponse('我是 process_request 响应的数据')
process_response 方法;这个方法是在请求处理之后被调用
def process_response(self , request , response):''':param request: 用户请求的数据:param response: 是视图返回出来的 HttpResponse 对象:return: 必须要有返回值 , 必须返回一个 HttpResponse 对象可以返回视图的 response 对象;也可以自定义 HttpResponse 对象 , 则视图中返回值无效'''print('process_response 执行')# return responsereturn HttpResponse('我是 process_response 响应的数据')
process_view 方法;这个方法在路由匹配之后 , 视图响应之前
def process_view(self , request , view_func , view_args , view_kwargs):''':param request::param view_func: 请求的 url 匹配到的视图函数:param view_args: 是给视图传递的参数:param view_kwargs: 是给视图传递的参数:return: 可以没有返回值;可以返回值匹配到的视图函数,也可以自定义 HttpResponse 对象 , 则视图函数无效'''print('process_view 执行')# return view_func(request) # okreturn HttpResponse('我是 process_view 响应的数据')
3、中间件拦截请求
1、限制 IP 访问频率
visit_ip = {}
class IpMiddleware(MiddlewareMixin):'''1、 获取访问的主机IP2、获取到 IP 访问的当前时间3、时间间隔为:40s ;超过15次'''def process_request(self , request):# 获取用户访问的主机 IPip = request.META.get('REMOTE_ADDR')# 获取 IP 访问的当前时间visit_time = time.time()# 数据保存格式{IP:[访问时间,……],IP2:[访问时间,……]……}# 判断 IP 是否在字典中存在 , 如果存在则这个 IP 不是第一次访问# 否则 这个 IP 是第一次访问if ip not in visit_ip:visit_ip[ip] = [visit_time]# ip 在字典中,将访问时间间隔为 大于40s的进行删除时间记录old_time = visit_ip.get(ip)for t in old_time:# 如果列表时间和当前访问时间超过 40s 则清除掉if visit_time - t > 40:old_time.remove(t)# 判断时间列表中记录是否有超过 15 次# 没有超过,进行记录当前的访问时间# 超过,限制当前 IP 访问if len(old_time) < 15:old_time.insert(0 , visit_time)else:return HttpResponse("您别累着了 , 休息一下吧!!!!")
2、禁止 IP 访问
black_ip = {} # {IP:count}
visit_ip = {}
class IpMiddleware(MiddlewareMixin):'''1、 获取访问的主机IP2、获取到 IP 访问的当前时间3、时间间隔为:40s ;超过 5次4、保存用户的不良行为记录次数 , 超过 3'''def process_request(self , request):# 获取用户访问的主机 IPip = request.META.get('REMOTE_ADDR')## 从数据库中取出ip进行判断(ip) , 数据库中有则表示已经拉黑 , 没有则表示正常# 检查 IP 是否被拉黑black_num = black_ip.get(ip , 0)if black_num > 3:## 将 ip 拉黑保存到数据库中return HttpResponse(status=404)# 获取 IP 访问的当前时间visit_time = time.time()# 数据保存格式{IP:[访问时间,……],IP2:[访问时间,……]……}# 判断 IP 是否在字典中存在 , 如果存在则这个 IP 不是第一次访问# 否则 这个 IP 是第一次访问if ip not in visit_ip:visit_ip[ip] = [visit_time]# ip 在字典中,将访问时间间隔为 大于40s的进行删除时间记录old_time = visit_ip.get(ip)for t in old_time:# 如果列表时间和当前访问时间超过 40s 则清除掉if visit_time - t > 40:old_time.remove(t)# 判断时间列表中记录是否有超过 15 次# 没有超过,进行记录当前的访问时间# 超过,限制当前 IP 访问if len(old_time) < 5:old_time.insert(0 , visit_time)else:# 保存累计不良行为记录次数black_ip[ip] = black_num + 1return HttpResponse("您别累着了 , 休息一下吧!!!!")
相关文章:
Django——中间件
Django——中间件 中间件可以介入 Django 的请求和响应的处理过程,修改 Django 的响应数据。中间件的设计为程序开发者提供了一种无侵入式的开发方式,增强 Django 框架的健壮性。 中间件可以在 Django 处理视图的不同阶段的干预。 Django 框架中原先内…...
景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!
随着无人机技术的不断发展与革新,它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防:边境管理部门利用无人机监控边境线,防止非法越境和其他安全威胁,同时也能监控地面安保人员的工作状态和行动路线。 …...
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式 1、对象使用Json序列化 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.r…...
[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)
一、前言 在学习 C 服务端的过程中,必不可少的一项就是熟悉一个网络库,包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等,其中 muduo 是由陈硕大佬个人开发的 TCP 网络库,最近跟着课程正在深…...
vue中怎样清除computed的缓存
vue中computed计算属性自带缓存,会提高程序的渲染性能,但根据业务需求以及相应的优化,可能要清除computed的缓存,具体方法和场景分为了vue2和vue3 vue2: this.$delete(this.someObject, cachedProperty); 使用 this…...
代码大师的工具箱:现代软件开发利器
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
整理好了!2024年最常见 100 道 Java基础面试题(四十三)
上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(四十二)-CSDN博客 八十五、Java 常用的元注解有哪些? 在Java中,元注解(Meta-Annotation)是指那些用于其他注解上的注解&…...
【TypeScript模块简介以及使用方法】
TypeScript模块简介 TypeScript中的模块(Modules)是代码的封装体,它们可以包含变量、函数、类和接口等。在TypeScript中,模块可以被其他模块引用和使用,从而实现代码的复用和模块化开发。 TypeScript支持两种模块系统…...
Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)
目录 ①力扣56. 合并区间 解析代码 ②力扣435. 无重叠区间 解析代码 ③力扣452. 用最少数量的箭引爆气球 解析代码 ④力扣397. 整数替换 解析代码1_递归改记忆化搜索 解析代码2_贪心策略 ⑤力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划(超时…...
java8 转对象,Java8转Map,Java8转Llist
1.准备数据 public static List<Persion> getData(){List<Persion> arrayList new ArrayList<>();arrayList.add(new Persion("李四","20","男"));arrayList.add(new Persion("王麻子","30","男&q…...
【Pytest官方文档翻译及学习】2.1 如何调用pytest
目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取有关版本、选项名称、环境变量的帮助 2.1.3 分析测试执行时间 2.1.4 管理加载插件 2.1.5 调用pytest的其他方式 2.1 如何调用pytest 2.1.1 指定要运行的测试 Pytest支持几种从命令行运行和选择测试的方法。、…...
RabbitMQ的用途
RabbitMQ主要有四个用途,分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下: RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦:提高系统容错性和可维护性 2.异步提速:提升用户体验…...
R语言软件安装及配置
1、下载 网址:www.r-project.org 1.1 下载R 选择download R 选择清华源进行下载 根据自己系统情况下载,我选择windows系统。 先选择base。 选择最新的版本下载。 1.2 下载RTools 下载好后,返回,选择RTools进入后,选…...
网络配置的加密存储
随着数据泄露事件的增加,扰乱了公司的正常工作周期,企业遭受了损失。事实上,数据泄露可以通过存储加密来控制,存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中,存储加密可用于存储设…...
你写代码,会关注时间复杂度吗?
虽然面试的时候总是被问到这个问题,但你写代码的时候,真的会想到这个问题吗?时间复杂度,说的当然不是你写的代码执行用了多长时间,而是代码执行语句的次数。 目录 每行代码都需要注意 计算方法 1 例如常量增长 2 …...
【连连国际注册/登录安全分析报告】
连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…...
linux进阶高级配置,你需要知道的有哪些(10)-远程访问
1、ssh协议的功能 为客户机提供安全的shell环境(字符界面),用于远程管理 2、openssh的服务说明 服务名:sshd 重启服务:systemctl restart sshd 主配置文件:/etc/ssh/sshd/_config 端口号:tcp 2…...
不显示 表格 style=“display: none;“ 这个默认是不显示的
不显示 表格 style“display: none;” 这个默认是不显示的 取消就可以或者 $(‘#modifyStatusBtn’).show(); <div id"userInfoContainer" style"display: none;"></div>...
Bittensor怎么挖?手把手教你,使用bitget钱包
4月 Binance 上新 TheBittensorHub (TAO), 这个项目究竟做了什么可以令其在上大舞台前就已经在所有通证中排名前 30? 本文将深度解析。 该项目既不直接贡献数据,也不直接贡献算力。 而是通过区块链网络和激励机制,来对不同的算法进行调度和…...
领略Java内部类的“内部”
内部类有两种情况: (1) 在类中定义一个类(私有内部类,静态内部类) (2) 在方法中定义一个类(局部内部类,匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类,非静态 我们首先看看类中内部类的两个特点: (1) 在外部…...
基于SpringBoot + Vue的新农村信息平台建设(角色:企业村民村委会管理员)
文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…...
Vue3-DateTime-Picker:如何构建现代化的Vue 3日期时间选择器解决方案?
Vue3-DateTime-Picker:如何构建现代化的Vue 3日期时间选择器解决方案? 【免费下载链接】vue3-date-time-picker Datepicker component for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vu/vue3-date-time-picker Vue3-DateTime-Picker作为基…...
蓝桥杯c++新手如何起步?快马生成带详解的入门代码示例
作为一名刚接触蓝桥杯C竞赛的新手,最头疼的往往不是算法本身,而是连基础语法都还没摸透就要面对复杂题目。最近在准备比赛时,我发现用传统方式学习效率很低——手动敲完代码后,经常因为不熟悉语法细节卡壳,调试半天也找…...
zynq ebaz4205开发板附带数字识别fpga例程 搭配ov7670/ov7725双目h...
zynq ebaz4205附带数字识别fpga例程代码 )扩展板zynq摄像头采集hdmi显示zynq ebaz4205 手机充电线micro usb供电,包含ov双目hdmi扩展板、配有micro usb供电、摄像头手机充电器一般即可充电,使用ov7670或原子ov7725摄像头,需要部分…...
NRBO - Transformer - BiLSTM回归:Matlab实现的数据预测魔法
NRBO-Transformer-BiLSTM回归 Matlab代码 基于牛顿拉夫逊优化算法优化Transformer结合双向长短期记忆神经网络(BiLSTM)的数据回归预测(可以更换为分类/单、多变量时序预测/回归,前私我),Matlab代码,可直接运行,适合小白新手 程序已…...
VMware虚拟机磁盘链乱了怎么办?手把手教你用vmware-vdiskmanager和自制工具修复VMDK快照关系
VMware虚拟机VMDK快照链修复实战指南 当你面对一个因误操作或系统故障导致快照链断裂的VMware虚拟机时,那种无力感就像看着一台无法启动的服务器——所有数据都在那里,却无法访问。本文将带你深入VMDK文件结构,通过命令行工具逐步修复损坏的…...
Cobar高可用性实现:心跳检测与故障转移的完整教程
Cobar高可用性实现:心跳检测与故障转移的完整教程 【免费下载链接】cobar a proxy for sharding databases and tables 项目地址: https://gitcode.com/gh_mirrors/co/cobar Cobar作为阿里巴巴开源的分布式数据库中间件,其高可用性实现是保障企业…...
Drawille Turtle图形编程:简单易学的终端绘图方法
Drawille Turtle图形编程:简单易学的终端绘图方法 【免费下载链接】drawille Pixel graphics in terminal with unicode braille characters 项目地址: https://gitcode.com/gh_mirrors/dr/drawille Drawille是一个创新的Python库,它使用Unicode盲…...
数字古籍下载工具使用指南:从入门到精通
数字古籍下载工具使用指南:从入门到精通 【免费下载链接】bookget bookget 数字古籍图书下载工具 项目地址: https://gitcode.com/gh_mirrors/bo/bookget 数字古籍下载工具是一款专为古籍爱好者和研究者设计的资源获取软件,能够帮助用户高效检索、…...
Qwen3-TTS声音克隆部署全攻略:简单3步,开启你的语音克隆之旅
Qwen3-TTS声音克隆部署全攻略:简单3步,开启你的语音克隆之旅 想不想让一段普通的文字,用你指定的声音说出来?比如,用你自己的声音给视频配音,用朋友的声音讲个笑话,或者用某个角色的声音朗读一…...
