深入学习Django源码基础13 - Django中的中间件(middleware)

Django中间件安全审计:CVE-2018-14574漏洞原理与复现 在Web应用开发中,中间件作为处理HTTP请求与响应的核心组件,承担着请求预处理、安全过滤、会话管理等关键职责。其工作原理是在请求到达视图函数前和响应返回客户端前执行特定逻辑,实现对应用功能的统一增强。从技术价值看,合理使用中间件能提升代码复用性和系统可维护性,但若实现存在缺陷,也可能成为攻击入口。URL重定向作为常见功能,若验证不当会导致开放重定向漏洞,攻击者可利用此漏洞实施钓鱼攻击或结合其他攻击链扩大危害。以Django框架的CommonMiddleware为例,其默认启用的APPEND_SLASH功能 阅读详情

运行启动,定位到http的处理文件

在core/handler.py中

def load_middleware(self):
         。。。。。。
        request_middleware = []
        for middleware_path in settings.MIDDLEWARE_CLASSES:
            。。。。。。加载模块
            if hasattr(mw_instance, 'process_request'):
                request_middleware.append(mw_instance.process_request)
            if hasattr(mw_instance, 'process_view'):
                self._view_middleware.append(mw_instance.process_view)
            if hasattr(mw_instance, 'process_template_response'):
                self._template_response_middleware.insert(0, mw_instance.process_template_response)
            if hasattr(mw_instance, 'process_response'):
                self._response_middleware.insert(0, mw_instance.process_response)
            if hasattr(mw_instance, 'process_exception'):
                self._exception_middleware.insert(0, mw_instance.process_exception)
 
        self._request_middleware = request_middleware

可以看到上段代码加载了在设置中的中间件

支持process_request的,插入request中间件

支持process_view的,插入view

支持process_template_response的插入template

支持process_response的插入response

支持process_exception的插入exception


在http处理中

def get_response(self, request):
        try:
            urlconf = settings.ROOT_URLCONF
            urlresolvers.set_urlconf(urlconf)
            resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
            try:
                response = None
                # Apply request middleware
                for middleware_method in self._request_middleware:
                    response = middleware_method(request)
                    if response:
                        break
                if response is None:
                    。。。
                    # Apply view middleware
                    for middleware_method in self._view_middleware:
                        response = middleware_method(request, callback, callback_args, callback_kwargs)
                        if response:
                            break
                if response is None:
                    try:
                        response = callback(request, *callback_args, **callback_kwargs)
                    except Exception as e:
                        for middleware_method in self._exception_middleware:
                            response = middleware_method(request, e)
                            if response:
                                break
                        if response is None:
                            raise

                # Complain if the view returned None (a common error).
                if response is None:
                    if isinstance(callback, types.FunctionType):    # FBV
                        view_name = callback.__name__
                    else:                                           # CBV
                        view_name = callback.__class__.__name__ + '.__call__'
                    raise ValueError("The view %s.%s didn't return an HttpResponse object." % (callback.__module__, view_name))

                # If the response supports deferred rendering, apply template
                # response middleware and the render the response
                if hasattr(response, 'render') and callable(response.render):
                    for middleware_method in self._template_response_middleware:
                        response = middleware_method(request, response)
                    response = response.render()

            except http.Http404 as e:
               …...
        return response

从上段代码中可以看出来

request执行的过程是

解析url。调用请求中间件过滤请求。

如果响应处理。那么直接返回响应结果

如果不响应处理

解析url得到view。调用view中间件过滤。

如果还没有得到响应

那么调用转化得到view类或者view响应方法

调用view的渲染方法得到response

最后调用返回response中间件过滤处理

返回response


流程上解析完以后。具体查看中间件部分。文件夹结构

middleware
    |----__init__.py
    |----cache.py                    缓存处理
    |----clickjacking.py            框架跨站保护
    |----common.py                公共部分
    |----csrf.py                        csrf保护
    |----doc.py                        头信息中添加xView,具体作用未知
    |----gzip.py                        gzip压缩
    |----http.py                        如果有Etag或者修改时间标记。做一些响应处理
    |----locale.py                    多语言处理
    |----transaction.py            交易中间件,如果发生异常,数据库将回滚


基础知识学习 -- qnx 系统 qnx os车载系统 阅读详情

相关推荐

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

Django 类视图 和 中间件

类视图 思考:一个视图,是否可以处理两种逻辑?比如get和post请求逻辑。 如何在一个视图中处理get和post请求 注册视图处理get和post请求 以函数的方式定义的视图称为 函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。 def register(request): "...

H_sen's Blog 625

Windows防火墙服务异常修复指南:0x80070422与0x6D9报错实战处理

本文针对Windows防火墙服务异常导致的0x80070422与0x6D9报错,提供了从基础到进阶的实战修复指南。核心是通过services.msc服务管理器检查并修复Windows Firewall服务,包括设置启动类型、检查依赖服务等关键步骤。同时介绍了当基础方法失效时,如何使用命令行工具、系统文件检查器(SFC/DISM)以及排查组策略与第三方软件冲突等深度解决方案,帮助用户彻底解决防火墙服务无法启动或访问的问题。

m9n0o的博客 542

django 测试覆盖率 coverage 回调

import logging import types from django.conf import settings from django.core.exceptions import ImproperlyConfigured, MiddlewareNotUsed from django.db import connections, transaction from django.urls import get_resolver, set_urlconf from django.utils.log

xiazhengwei1994的博客 364

Android 的端智能学习路径

基础层:先补齐 Android 进阶(JNI / 性能优化)和 AI 基础概念,无需深入算法开发;核心层:掌握 TFLite 的模型加载、推理、量化,能完成基础端侧推理;落地层:聚焦实战场景(图像 / OCR / 语音),解决工程化问题(模型管理、异常处理);优化层:通过模型量化、硬件加速、工程优化,提升推理性能和用户体验。

hqiangtai的博客 344

Xilinx System Generator多速率系统(Multi-Rate Systems)的使用

在本实验练习中,您将学习在System Generator中如何使用多个时钟域有效地实现具有多个数据速率的设计。

白码王子小张的博客 1092

Django 中间件

中间件可以定义四个方法,分别是:自定义中间件的步骤:在 app 目录下新建一个 py 文件,名字自定义,并在该 py 文件中导入 MiddlewareMixin:自定义的中间件类,要继承父类 MiddlewareMixin:pass在 settings.py 中的 MIDDLEWARE 里注册自定义的中间件类:自定义中间件类的方法有:process_request 和 process_response。

2401_89581364的博客 1381

KUKA 虚拟调试实战——打通Simpro4.1与OfficeLite8.6的通信与实时控制链路

本文详细介绍了KUKA虚拟调试实战,重点解析如何打通Simpro4.1与OfficeLite8.6的通信与实时控制链路。通过环境搭建、权限配置、机器人型号匹配等关键步骤,帮助工程师高效完成机器人轨迹规划和PLC联锁逻辑验证,大幅降低真机调试风险。文章还提供了典型报错解决方案和实时控制优化技巧,适用于工业机器人仿真与培训场景。

weixin_30907935的博客 444

python middleware_Django组件之Middleware

一、中间件在django的settings.py文件下,有一个变量为middleware,里面放的就是中间件。middleware = ['django.middleware.security.securitymiddleware','django.contrib.sessions.middleware.sessionmiddleware','django.middleware.common.co...

weixin_28764661的博客 664

Ubuntu 部署 Ollama 避坑指南:下载失败 / 服务崩溃?一招解决所有问题!

本文详细介绍了在Ubuntu系统上安装Ollama大模型工具的完整流程和常见问题解决方案。主要内容包括:环境检查(系统版本、架构、依赖)、一键安装步骤、端口配置和服务启动等核心操作。重点针对下载失败、服务启动异常、权限不足等高频问题,提供了国内镜像配置、手动创建服务文件、用户组添加等实用解决方案。最后通过测试Qwen2.5轻量模型验证安装效果,并给出低配设备选型建议。全文提供可复制的命令行操作,帮助用户快速搭建离线可用的大模型环境。

2501_93651177的博客 1008

SAP_FI模块_固定资产期初导入全流程(含导入代码)

SAP 期初导入资产主数据以及金额相关的操作全流程记录,包含了批导程序的代码,以及错误记录

风沙的博客 1404

【django】自定义中间件

一. ⾃定义中间件 1、Django中的中间件是⼀个轻量级、底层的插件系统,可以介⼊Django的请求和响应处理过程,修改Django的输⼊或输出。中间件的设计为开发者提供了⼀种⽆侵⼊式的开发⽅式,增强了Django框架的健壮性。 2、我们可以使⽤中间件,在Django处理视图的不同阶段对输⼊或输出进⾏⼲预。 二. 实现步骤 1、项⽬根⽬录下创建python package 2、⾃定义⼀个python⽂件 from django.utils.deprecation import MiddlewareMi.

python全栈 1836

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1542

Channels 2.1.5 版本说明详解:Django 中间件缓存的兼容性修复与 ASGI 中间件架构

**导读**:本文以官方发布说明 [docs/releases/2.1.5.rst](https://link.gitcode.com/i/12638443d436793ffd5c406faed1c5cf) 为骨架,解读 Channels 2.1.5 这一 bugfix 版本的核心修复——Django 中间件缓存机制在 Django 1.11 与 Django 2.0 上恢复正常工作(此前的 2.

gitblog_00782的博客 438

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Yuzu 模拟器安装全攻略:从克隆仓库到开玩的 6 步流程

Yuzu 是任天堂 Switch 游戏模拟器,可以让 Windows 或 Linux 电脑运行 Switch 游戏。本文讲清如何用版本仓库完成 Yuzu 安装:克隆仓库、挑版本、启动程序、做首启配置,照着走完即可开玩。 ## Yuzu 安装前的环境准备 先给结论:一台近几年的 Windows 10/11 或 Linux 电脑即可跑起来,你只需要预装 git 这一个工具。 - 操作系统:Win

gitblog_00872的博客 782

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

django-request 是什么?Django 网站请求统计模块完全指南

**django-request** 是一款开源的 Django 请求统计模块,它会把网站收到的每一次 HTTP 请求自动存入数据库,供管理员在后台查看和分析。无论你想了解网站流量趋势、谁正在线上、用户来自哪个搜索引擎,还是想排查 404 错误页面,django-request 都能帮你轻松搞定,是 Django 网站统计与访问日志分析的一站式解决方案。 [![django-request 请求

gitblog_00154的博客 730

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

django的路由源码过程剖析

在之前的文章中已经提到每当客户端的请求过来的时候都会将请求交给WSGIHandler类,在WSGIHandler对象的call方法中会调用到WSGIHandler的父类django.core.handlers.base.BaseHandler的get_response方法 1 class WSGIHandler(base.BaseHandler): 2 request_clas...

weixin_30721077的博客 207

django settings.py 源码

"""Django settings for qwe project.Generated by 'django-admin startproject' using Django 1.9.13.For more information on this file, seehttps://docs.djangoproject.com/en/1.9/topics/settings/For the full...

zhangyu4863的博客 3万+

django-request 流量模块深度解析:从 Hit 到 Unique Visitor 的 13 种指标

django-request 是 Django 生态中最流行的**流量统计模块**之一,它通过中间件把每一次 HTTP 请求写入数据库,再基于这些原始记录,实时计算出 Hit、Unique Visitor、Unique Visit 等十余种**网站流量指标**,让站长无需接入第三方统计服务,就能在 Django Admin 后台看到完整的访问报告。本文将带你逐个拆解 django-request

gitblog_00153的博客 287

web3.py 中间件(Middleware)完全指南:洋葱栈架构、内置中间件与自定义扩展

Web3 实例在默认情况下会挂载多层中间件,它们位于公开的 `Web3` 方法与 Provider 之间,负责执行交易参数校验、数据类型转换、ENS 域名解析、Gas 估算等职责,每一层都可以修改请求和/或响应。本文以 [docs/middleware.rst](https://link.gitcode.com/i/18e47e79a3305fd94fd615a6e324217c) 为核心脉络,结

gitblog_00852的博客 195

Django支持多语言开发—i18n_django i18n

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

2401_84247423的博客 1159

Django框架全面讲解(三)

继文章:Django框架全面讲解(二) 目录七、中间件(MiddleWare)7.1、 自定义中间件7.1.1、创建中间件类7.1.2、注册中间件八、 Form九、 认证系统(auth) 七、中间件(MiddleWare) django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就

虫无涯的博客 662

详解Django的CSRF认证实现

什么是 CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求。举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的。 1.csrf原理 csrf要求发送post,put...

zcg359670476的博客 503

Django深入

django, web框架, 别人写好了一些代码,可以在它的基础上实现网站等。python 中常见的 web 框架1.2.3.4.5.pycharm 导致的bug, 可能的 bug, 很早之前的问题了,现在应该没了,但是记录下如果django 中的 setttings.py 中的 templates 列表中的 是这样的话,'DIRS' :[os.path.join(BASR_DIR, 'templates')],需要自己引入 os 模块 import ospycharm 方式启动项目app在django 项

weixin_43932886的博客 918

Django中间件简析

上一篇简单的叙述了CSRF这个中间件的作用,他在执行视图函数之前可以对csrftoken进行验证,如果通过才执行否则直接报错。那么什么是中间件呢?这个要回到Django的生命周期里面。一个基本的生命周期是用户输入一个URL,通过urls.py找到对应的视图函数,然后进行数据处理,返回渲染后的结果。在url和视图函数的匹配过程中,还有一个重要的过程,就是依次执行所有的中间件的类...

weixin_34342992的博客 93

老 Mac 装新系统,用 OpenCore Legacy Patcher 把 Big Sur 到 Sequoia 装回去

OpenCore Legacy Patcher(下称 OCLP)是面向 Intel 老 Mac 的开源补丁工具,目标是让 2007 年之后的机型装回 macOS Big Sur、Monterey、Ventura、Sonoma、Sequoia 这些新版系统。"系统设置"里点升级被拒的机器,走下面这条路径基本都能通。 [![OpenCore Legacy Patcher 主菜单界面,老 Mac 装新

gitblog_00324的博客 222
上一篇: 深入学习Django源码基础12 - 简要分析Django中template模块2
下一篇: 深入学习Django源码基础14 - Django中forms简要分析
watsy
博客等级 码龄19年 133粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值