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

Django之五种中间件定义类型—process_request、process_view、process_response.......

目录

1. 前言

2. 基础中间件

3. 如何自定义中间件

4. 五种自定义中间件类型

4.1 process_request

4.2 process_view

4.3 process_response

4.4 process_exception

4.5 process_template_response

5. 最后

1. 前言

哈喽,大家好,我是小K,今天咋们分享的内容是:Django中的五种自定义中间件类型

在Django中,有一种特殊的存在,那就是中间件

中间件是一种轻量化可复用的Django组件,可以在请求之前、之后、视图之前或者响应之后作出一些动作,例如身份验证或者限流等。

本篇文章带你学会五种自定义中间件类型:

process_request、process_view、process_response、process_exception、process_template_response

2. 基础中间件

在学习自定义中间件时,我们先来看Django中已有的中间件:

  1. django.middleware.security.SecurityMiddleware: 这是Django的安全中间件,用于实施各种安全策略,例如设置HTTP头部以防止一些类型的攻击。

  2. django.contrib.sessions.middleware.SessionMiddleware: 这是用于处理会话的中间件,它允许您在请求之间存储和检索数据。

  3. django.middleware.common.CommonMiddleware: 这个中间件处理一般的HTTP请求和响应,例如添加适当的头部信息、处理URL重定向等。

  4. django.middleware.csrf.CsrfViewMiddleware: 这是用于处理跨站请求伪造保护的中间件,它确保每个POST请求都包含有效的CSRF令牌。

  5. django.contrib.auth.middleware.AuthenticationMiddleware: 这个中间件用于处理用户身份验证,它将用户对象添加到每个请求。

  6. django.contrib.messages.middleware.MessageMiddleware: 这个中间件用于处理Django消息框架中的消息。

  7. django.middleware.clickjacking.XFrameOptionsMiddleware: 这个中间件用于设置X-Frame-Options头,以防止点击劫持攻击。

3. 如何自定义中间件

在了解基础中间件之后,我们来看看如何自定义中间件:

我们可以随便创建一个文件,下面创建一个自定义模块:

在这个模块中,我们单独定义类:

先不看具体的代码

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixinclass AuthenticateUser(MiddlewareMixin):def process_request(self, request):# request是请求相关所有的数据if request.GET.get("token") == '123456':  # 判断用户是否携带token,也就是是否登录request.role = 'user'  # 当前角色为普通用户returnreturn HttpResponse('出错了')def process_view(self, request, view, *args, **kwargs):# request是请求相关所有的数据; view是试图函数; 路由参数*args, **kwargsif 'admin' in request.path_info.split('/')[1] and request.role == 'user':  # 如果当前url以admin开头的话,用户是无权限访问的return HttpResponse("无权限访问")returndef process_response(self, request, response):# request是请求相关所有的数据# response是试图函数返回的那个对象(封装了要返回到用户浏览器的所有数据)response['name'] = 'jiaoxingk'  # 在返回的时候,加入一些返回值信息return responsedef process_exception(self, request, exception):print(request)print(exception, type(exception))return HttpResponse("错误了")def process_template_response(self, request, response):response.body = 'hello'return response

接着,我们需要注册中间件,也就是通过字符串路径的形式,进行动态导入

不知道为什么通过字符串可以动态导入的原理的话,可以参考我的这篇文章:

Python中的反射——getattr与动态导入模块

 

4. 五种自定义中间件类型

ok, 现在我们来具体看看以上自定义中间件的具体代码:

4.1 process_request

这是在请求到来之后,所执行的操作。

请求一来,最先做的应该是匹配相应的视图函数,而加上process_request,就代表在匹配之前,就截停了请求,开始执行操作

校验token,看是否登录(假装123456代表用户登录了)

如果登录了,就给该用户的角色定义为普通用户,然后返回空值,代表继续执行匹配

如果没有就提前截停请求,直接返回响应

4.2 process_view

此时,请求已经匹配到相应的视图函数,但是在执行视图函数之后,又做了一次操作:

这里,判断url的前缀是不是admin(管理员才能访问的),如果你只是普通用户的话,那么会没有权限继续访问了。

因此,这里就提前截停,返回值

4.3 process_response

现在,视图函数也已经执行完了,该返回给浏览器了

在返回之前,我加了一条响应信息,代表我当前的一个记录

这是浏览器里面可以看到的:

4.4 process_exception

如果在执行视图的时候,出现了异常,那么就会执行这里的语句:

 

4.5 process_template_response

这个比较特殊,主要对于视图函数返回内容渲染扩展。

 

 process_template_response的调用前提是:

1. 在视图函数中如果返回的对象内部有一个render方法且可以被调用执行
2. process_template_response返回response参数(返回值)
3. 在自定义的MyReponse的render方法中必须返回HttpRespose

 基本不常用这个。

5. 最后

好了,今日的中间件分享就到这里吧。

对于后两个中间件类型,一般是不常用的,主要还是process_requestprocess_viewprocess_response这三种用的比较多

了解到中间件的基础用法之后,咋们下一节开始深入研究它的底层源码啦,看看中间件到底是如何加载并且运行的。

相关文章:

  • Taro框架中的H5 模板基本搭建
  • 鸿蒙OS开发实战:【自动化测试框架】使用指南
  • 1. TypeScript: JavaScript 的超集,为大型应用而生
  • NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程
  • vivado ILA 交叉触发
  • 开源区块链系统/技术 总结(欢迎补充,最新)
  • Mysql数据库getshell方法
  • 访问网站时你的电脑都做了什么
  • 如何批量获取商品详情数据(淘宝1688京东商品采集示例)
  • 2024/4/9
  • 数据驱动决策的秘密武器:一探FineBI的核心功能
  • spikingjelly学习-训练网络
  • ssm034学生请假系统+jsp
  • 路由器拨号失败解决方法
  • React中的函数组件和类组件的区别
  • [译]CSS 居中(Center)方法大合集
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • codis proxy处理流程
  • export和import的用法总结
  • in typeof instanceof ===这些运算符有什么作用
  • Python学习之路16-使用API
  • RxJS: 简单入门
  • Selenium实战教程系列(二)---元素定位
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue学习系列(二)vue-cli
  • 编写符合Python风格的对象
  • 从零开始的无人驾驶 1
  • 关于for循环的简单归纳
  • 基于Android乐音识别(2)
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 前端临床手札——文件上传
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 硬币翻转问题,区间操作
  • AI算硅基生命吗,为什么?
  • HanLP分词命名实体提取详解
  • 阿里云移动端播放器高级功能介绍
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​Python 3 新特性:类型注解
  • ​secrets --- 生成管理密码的安全随机数​
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (1)SpringCloud 整合Python
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (十三)Maven插件解析运行机制
  • (十一)图像的罗伯特梯度锐化
  • (五)关系数据库标准语言SQL
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)从 Java 代码到 Java 堆
  • ***通过什么方式***网吧
  • .NET 设计模式初探
  • .Net(C#)自定义WinForm控件之小结篇