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) 在外部…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
