Python web实战之细说Django的中间件

news2024/11/20 2:25:16

                 


🔑 关键词:Python Web 开发、Django、中间件

今天分享Python Web开发中的一个重要成员:Django的中间件。介绍中间件的概念、作用及其在实战中的应用。

1 什么是中间件

在Python Web开发中,中间件(Middleware)是指位于Web应用程序和Web服务器之间的一层软件组件。它能够拦截请求和响应,进行一系列的处理操作,然后将请求传递给下一个中间件或视图函数。

中间件的作用类似于一个过滤器,可以对请求和响应进行定制化处理,实现各种功能需求。

1.1 Django中间件原理

Django中间件的原理是基于一个称为"请求/响应处理"的概念。当一个请求到达Django应用程序时,它将依次通过中间件组件,然后传递给相应的视图函数进行处理。在处理响应时,中间件组件将再次按照相反的顺序进行处理。

Django中的中间件是一个Python类,它实现了特定方法来处理请求和响应。以下是中间件类可能包含的方法:

  • init(self, get_response): 这是中间件类的构造方法,其中get_response参数是一个可调用的对象,表示后续的中间件或视图函数。

  • call(self, request): 这个方法在每次请求到达时被调用。它接收一个request参数,表示当前的请求对象。在这个方法中,你可以编写请求处理的逻辑,并决定是否将请求传递给下一个中间件或视图函数。

  • process_view(self, request, view_func, view_args, view_kwargs): 当一个视图函数被调用之前,这个方法将被调用。你可以在这里执行与视图函数相关的逻辑。

  • process_exception(self, request, exception): 当视图函数抛出异常时,这个方法将被调用。你可以在这里处理异常并返回相应的响应。

  • process_response(self, request, response): 当一个响应返回时,这个方法将被调用。你可以在这里对响应进行后处理,例如添加响应头或修改响应内容。

Django中间件的执行顺序是由MIDDLEWARE设置中的顺序决定的。这个设置位于 Django 项目的设置文件(settings.py)中。

下面是一些配置中间件执行顺序的方法:

  • 1. 在设置文件中按照顺序列出中间件类的路径:

   MIDDLEWARE = [
       'middleware1',
       'middleware2',
       'middleware3',
   ]
  • 2. 使用中间件类路径和参数的元组形式,以便进行更高级的配置:

   MIDDLEWARE = [
       ('middleware1', {'option': value}),
       ('middleware2', {'option': value}),
       'middleware3',
   ]

这种方式允许你为每个中间件指定特定的参数,从而更灵活地配置中间件。

中间件按照它们在列表中的顺序依次执行,直到达到最后一个中间件或一个中间件返回响应为止。然后,中间件将按相反的顺序再次执行,对响应进行后处理。

通过编写自定义中间件,你可以在请求和响应处理过程中添加自定义逻辑,实现身份验证、日志记录、性能优化等功能。同时Django还提供了一些内置的中间件,例如身份验证中间件、CSRF中间件等。

1.2 中间件的常见用途

中间件在Web开发中起着至关重要的作用。它具有以下几个方面的功能:

  1. 请求和响应处理:中间件可以对请求和响应进行预处理和后处理,例如修改请求头、添加响应头等。

  2. 身份验证:中间件可以实现用户身份验证的逻辑,例如检查用户是否登录、验证访问权限等。

  3. 性能优化:中间件可以进行性能监控、缓存优化、请求压缩等操作,提升Web应用的性能。

  4. 错误处理:中间件可以捕捉异常、记录日志,并对错误进行处理和反馈给用户。

  5. 数据分析:中间件可以收集和分析请求数据,用于统计和监控Web应用的使用情况。

  6. 安全性:中间件可以在请求和响应中加入安全措施,例如防止跨站脚本攻击(XSS)、CSRF攻击等。

2 Django中的中间件实战

现在通过几个应用场景来深入了解Django中的中间件是如何工作的。

2.1 访问日志中间件

访问日志是Web应用开发中非常重要的一部分,它记录了用户的访问行为,有助于调试bug,分析用户行为和优化网站性能。我们可以编写一个访问日志中间件,来记录用户每次请求的详细信息,并将其保存到日志文件中。

下面是一个简化的访问日志中间件示例:

import logging

class AccessLogMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        self.logger = logging.getLogger('access')

    def __call__(self, request):
        # 处理请求前的逻辑
        self.logger.info(f"User {request.user} is accessing {request.path}")

        response = self.get_response(request)

        # 处理响应后的逻辑
        return response

在上面的代码中,我们定义了一个AccessLogMiddleware类,它接收一个get_response参数,在实例化时保存下来。get_response参数是一个可调用对象,表示后续中间件或视图函数。

__call__方法中,我们可以编写处理请求和响应的逻辑。例如,我们使用logging模块创建了一个名为access的日志记录器,并在每次请求时记录用户的访问信息。将这个中间件添加到Django的中间件列表中,就可以在整个应用程序中记录访问日志了。

2.2 身份验证中间件

身份验证是Web应用中常见的功能之一。我们可以使用Django的身份验证中间件来实现用户登录验证、权限检查等功能。

下面是一个简单的身份验证中间件示例:

from django.shortcuts import redirect

class AuthenticationMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if not request.user.is_authenticated:
            return redirect('login')

        response = self.get_response(request)

        return response

在上面的代码中,我们定义了一个AuthenticationMiddleware类,它在每次请求到达时检查用户是否已经登录。如果用户未登录,则将其重定向到登录页面。将这个中间件添加到Django的中间件列表中,就可以实现简单的身份验证功能。

3 技术总结

本文详细介绍了中间件的概念、作用以及在实战中的应用。通过实例代码的演示,展示了访问日志中间件和身份验证中间件的使用方法。通过中间件,开发者可以在请求到达视图函数之前或响应返回给客户端之前对其进行预处理或后处理。

中间件的意义在于提供了一种可插拔的机制,使开发者能够轻松地添加、配置和重用功能模块,从而提高开发效率和代码可维护性。

文章的内容若对您有所帮助,欢迎点赞收藏转发,感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/851713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FAQ】视频监控EasyCVR平台登录密码忘记?如何通过navicat连接数据库进行修改?

TSINGSEE青犀视频监控管理平台EasyCVR可以根据不同的应用场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,平台可实现视频实时直播、云端录像、云存储、回放与检索、告警上报、视频快照、…

企业智能制造成熟度报告

《“十四五”智能制造发展规划》明确提出,到2025年,70%的规模以上制造业企业基本实现数字化网络化,智能制造能力成熟度水平明显提升,并指出要建立长效评价机制,鼓励第三方机构开展智能制造能力成熟度评估,研…

LLVM笔记2 Intermediate Representation (IR)

参考链接:https://llvm.org/devmtg/2019-04/slides/Tutorial-Bridgers-LLVM_IR_tutorial.pdf https://zhuanlan.zhihu.com/p/163063995 https://zhuanlan.zhihu.com/p/163328574 文章目录 IR的布局1. IR语法2.IR递归函数3.使用迭代的方式4.全局变量5.LLVM’s type s…

STM32U5系列芯片,不支持ST-LINK v2怎么办

方案一 淘宝 唐卡思 购买stlink V3 (万能的淘宝) 方案二 使用jlink KEIL版本V5.34以上 支持M33编译 工程的分扇加载SCT件需要修改

LDAP协议

目录 LDAP是什么?什么是目录服务?什么是LDAP认证? 为什么要用LDAP?LDAP能做什么?为什么用LDAP做身份验证?LDAP的产品&实现 LDAP基本模型目录树&名词解释分布式 LDAP的操作 LDAP是什么? …

Elasticsearch:升级 Elasticsearch 最安全的方法

关于升级自己的 Elasticsearch 集群有很多种办法。很多涉及到滚动升级或需要重启集群。这是一个比较复杂的过程。一般来说,有两种可能发生的情况: 滚动升级(无停机时间)整个集群重新启动(一些停机时间) 如…

【Sa-Token】9、Sa-Token实现在线用户管理功能

尽管框架将大部分操作提供了简易的封装,但在一些特殊场景下,我们仍需要绕过框架,直达数据底层进行一些操作。 1、官方文档 会话查询 https://sa-token.cc/doc.html#/up/search-sessionSa-Token提供以下API助你直接操作会话列表&#xff1a…

电脑选购:6000元左右买到性价比超高的笔记本电脑,准大学生的购机指南

目录 一、ThinkBook 14 二、华硕灵耀14 2023 四、宏碁掠夺者擎Neo 五、惠普(HP)暗影精灵9 六、联想拯救者R7000P 2023 每年高考毕业季,许多即将进入大学的毕业生都会面临新电脑的选择,而对于喜欢玩游戏的同学,一般…

1分钟快速将智能聊天机器人接入国产ChatGLM开源模型

“ 了解如何在短短1分钟内,让智能聊天机器人与国产ChatGLM开源模型无缝连接,为你的应用增添智能交流能力!” 01 — 昨天发布ChatGPT微信助手体验群后,见《ChatGPT 微信助手上线!问答更便捷,功能持续升级中。…

Java 代码重试实现方式

Java 代码重试实现方式 一.方法内直接自动重试二.静态代理方式1.启动类2.接口3.实现4.静态代理5.单元测试类 三.JDK 动态代理1.代理类2.单元测试 四.CGLIB 动态代理1.动态代理类2.单元测试 五.手动 AOP1.自定义注解2.重试注解切面3.测试类4.单元测试方法 六.Spring Retry1.测试…

固态硬盘接口对比

固态硬盘接口对比 M.2接口固态硬盘固态硬盘接口固态硬盘尺寸接口兼容性 M.2接口 M.2接口,也称为NGFF(Next Generation Form Factor),是一种计算机拓展接口规范。常见的M.2接口有A key、B key、E key和M key,不同的key…

书单背景怎么制作?分享一个实用的工具

在今天的信息时代,越来越多的人通过阅读来丰富自己的知识和技能。为了方便大家查找阅读材料,书单背景的制作变得越来越重要。本文将介绍书单背景的制作方法以及需要注意的问题。 书单背景的制作方法 1. 使用在线制作工具 在线制作工具如Canva提供了许多…

比较研发项目管理系统:哪个更适合您的需求?

项目管理系统对于保持项目进度、提高效率和确保质量至关重要。然而,市场上众多的研发项目管理系统让许多团队陷入选择困难。本文将对几个主流的研发项目管理系统进行深入分析,以帮助您找到最适合您团队的解决方案。 “哪个研发项目管理系统好用好&#x…

【MySQL】检索数据使用数据处理函数

函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。 函数没有SQL的可移植性强:能运行在多个系统上的代码称为可移植的。多数SQL语句是可移植的,而函数的可…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构,参数化配置是一个非常重要的点,而Netflix也开源了一个叫变色龙Archaius的配置中心客户端,而且Archaius可以说是比其他客户端具备更多生产级特性,也更灵活。*在NetflixOSS微服务技术栈…

CSS 的选择器有哪些种类?分别如何使用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素选择器(Element Selector)⭐ 类选择器(Class Selector)⭐ ID 选择器(ID Selector)⭐ 后代选择器(Descendant Selector)⭐ 子元素选择器&a…

本地开发 npm 好用的http server、好用的web server、静态服务器

好用的web server总结 有时需要快速启动一个web 服务器(http服务器)来伺服静态网页,安装nginx又太繁琐,那么可以考虑使用npm serve、http-server、webpack-dev-server。 npm serve npm 的serve可以提供给http server功能&#…

外贸行业三大客户管理软件的特点?

外贸企业在开拓国际市场的过程中,经常会遇到客户信息混乱、销售流程复杂、市场竞争激烈等痛点。因此,外贸企业急需一款CRM系统来帮助他们管理客户信息、跟进销售机会等。这里有一份外贸客户管理软件排名,希望对您有所帮助。 Zoho CRM Zoho …

Nacos基本应用

Nacos 基本应用 Nacos 提供了 SDK 和 OpenAPI 方式来完成服务注册与发现等操作,SDK 实际上是对于 http 请求的封装。 微服务架构的电子商务平台,其中包含订单服务、商品服务和用户服务。可以使用 Nacos 作为服务注册和发现的中心,以便各个微…

aijs 盒子出血

效果演示 盒子出血演示 1.左下点 2.左上点 3.上左点 var doc activeDocument; var pt 72 / 25.4; var cx 3 * pt;var marks []; for (var i 0; i < doc.selection.length; i) {var shape doc.selection[i];if (shape.typename GroupItem && shape.pageItems.…