中间件

  django的中间件是一个全局范围内处理django的请求和响应的框架级别的钩子。

  作用:对于一个请求到达视图函数的前后进行处理

  本质:中间件的本质是一个类,类中定义了特定的方法,Django框架会在特定时间去执行这些方法处理请求。

  中间件的五个方法以及四个特征:

    五个方法:

      1、process_request(self, request)

      2、process_response(self, request, response)

      3、process_view(self, request, view_func, view_args, view_kwargs)

      4、process_exception(self, request, exception)

      5、process_template_response(self, request, response)

    四个特征:

      1、执行时间(触发条件):何时执行(何时被触发)

      2、参数:每个参数代表的含义

      3、执行顺序:在多个中间件都有某一个方法的时候,方法执行的先后顺序

      4、返回值:不同的返回,会得到怎样的结果

自定义中间件

  自定义中间件的步骤:

    1、在需要自定义中间件的app路径下创建一个文件夹存放定义中间件文件(文件夹命名最好见名知意)

    2、创建一个py文件,在该文件内编写中间件代码

    3、中间件是一个类,定义时需要继承MiddlewareMixin,然后定义需要用到的方法

      from django.utils.deprecation import MiddlewareMixin
      class MyMiddleWare(MiddlewareMixin):

      def process_request(self, request):
      pass

    4、注册中间件,使其生效

      在settings中的MIDDLEWARE列表中,添加自定义中间件即可

        格式:app文件夹.中间件文件夹.中间件文件.需要注册的中间件类

        'right_manage.middlewares.mymiddleware.MyMiddleWare'

中间件的五个方法和四个特征

  1、process_request(self, request)

    作用:在一个请求到达视图函数之前(也就是路由匹配前),对该请求做相关处理。(可以实现登录认证的功能)

    执行时间:在请求到达视图函数之前(路由匹配前)

    参数:

      request是一个请求对象,和后续视图函数接收的是同一个对象。(可以打印它们的id值验证)

    执行顺序:按照中间件注册的先后顺序执行

    返回值:

      返回None时,表示整个请求流程正常执行(后续接着执行其他中间件方法、路由匹配、视图函数)

      返回一个响应对象时,不执行后续操作(包括其他中间件方法、路由匹配、视图函数);

        如果当前中间件定义有process_response方法,那么执行该方法后返回结果给浏览器;

        如果当前中间件没有定义process_response方法,直接将当前响应对象返回给浏览器。

  

  2、process_response(self, request, response)    

    作用:对一个响应对象返回给浏览器前,做相关处理。

    执行时间:在视图函数处理完请求之后

    参数:

      request是一个请求对象,和视图函数接收的是同一个对象。(可以打印它们的id值验证)

      response是一个响应对象,中间件接收到的response可能是视图函数返回的响应对象,也可能是其他中间件处理后的响应对象 或 自定义的一个响应对象

    执行顺序:

      按照中间件注册的先后顺序,倒序执行

      也就是从最后一个定义了process_response方法的中间件开始往上执行

      所以,处于中间位置的中间件接收的response可能是视图函数返回的响应对象(尾部的中间件没对其做任何处理),也可能尾部中间件处理后的response

    返回值:

      必须是一个响应对象,否则报错

  3、process_view(self, request, view_func, view_args, view_kwargs)

    作用:在一个请求经过路由匹配,到达视图函数之前,对该视图函数的参数以及请求对象做处理

    执行时间:路由匹配之后,视图函数之前,且在其他中间件的process_request之后

    参数:

      request是一个请求对象,和视图函数接收的是同一个对象。(可以打印它们的id值验证)

      view_func:路由匹配得到的对应视图函数的内存地址

      view_args:对应视图函数的位置参数

      view_kwargs:对应视图函数的关键字参数

    执行顺序:

      按照中间件的注册顺序执行

    返回值:

      返回None时,处理请求的流程正常执行

      返回一个响应对象时,后续的视图函数和其他中间件的process_view都不执行,直接执行process_response(从最后一个中间件开始倒序执行该方法)

    如果路由匹配不成功(输入的地址有误),那么就不会执行process_view,直接执行的process_response(从最后一个中间件开始倒序执行该方法)

  4、process_exception(self, request, exception)

    作用:处理视图函数中发生的异常

    触发条件:视图中出现异常才会执行,所以执行时间在视图函数之后,也就在process_request和process_view之后,且在process_response之前

    参数:

      request是一个请求对象,和视图函数接收的是同一个对象。(可以打印它们的id值验证)

      exception就是视图函数中出现的异常,该变量是字符串,返回一个错误信息(如invalid literal for int() with base 10: 'abc')

    执行顺序:

      按照中间件注册的先后顺序,倒序执行(凡是在视图函数处理完后执行的中间件方法都是倒序执行)

    返回值:

      返回一个None时,表示当前中间件的process_exception方法并没有对异常进行处理,而是将该异常交给下一个执行该方法的中间件。如果没有任何一个中间件对异常进行处理,那么django默认就会将异常抛出在终端显示;

      返回一个响应对象时,表示当前中间件已经对该异常进行了处理,后续的中间件不再执行该方法。后续中间件直接执行process_response方法。

  5、process_template_response(self, request, response)

    作用:处理视图函数中返回的TemplateResponse对象

    触发条件:视图函数中返回的对象是TemplateResponse对象,执行时间在视图函数之后,也就是在process_request和process_view之后,且在process_response之前。如果视图中出现异常则不执行该方法。(出现异常会执行process_exception)

    执行顺序:按照中间件注册的先后顺序,倒序执行

    参数:

      request是一个请求对象,和视图函数接收的是同一个对象。(可以打印它们的id值验证)

      response是视图函数返回的TemplateResponse对象

    返回值:

      必须返回一个response对象,否则报错

    

    补充:render 和 TemplateResponse:

      render方法内部实现了模板文件的相应字符串的替换功能,返回值就是一个替换过字符串的HttpResponse对象。也就是说再视图函数处理阶段对应的数据已经成型了。

      而TemplateResponse可以根据不同的需要,在中间件的process_template_response阶段对相应的模板和数据进行处理

      例如:

        在该阶段可以修改指定模板文件或者数据字典中的数据  

          response.template_name = 'base.html'
          response.context_data = {}

      还可以实现:

        1、根据不同设备(PC、手机)返回不同模板文件(响应式布局则不需要考虑)

        2、对于多个不同的模板文件需要使用到同一份数据,只需要在该方法内获取到需要的数据即可实现

  总结:

    这五个方法的执行的先后顺序:

      process_request——>process_view——>process_exception、process_template_response——>process_response

django—中间件相关的更多相关文章

  1. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  2. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  3. Python菜鸟之路:Django 中间件

    前言 在正式说Django中间件之前需要先了解Django一个完整的request的处理流程.我从其他网站扒了几张图过来. 图片一: 文字流程说明:如图所示,一个 HTTP 请求,首先被转化成一个 H ...

  4. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  5. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  6. Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09

    目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...

  7. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  8. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  9. django中间件 csrf auth认证

    django中间件 能做全局访问频率限制,身份校验,黑名单,白名单 用法: 新建一个文件夹,文件夹新建一个py文件,文件中写如下代码 注意点:你写的类必须继续MiddlewareMixin from ...

随机推荐

  1. HBase启用压缩

    1. 压缩算法的比较 算法 压缩比 压缩 解压 GZIP 13.4% 21MB/s 118MB/s LZO 20.5% 135MB/s 410MB/s Snappy/Zippy 22.2% 172MB ...

  2. 高可用集群之keepalived+lvs实战2

    keepalived简介 lvs在我之前的博客<高负载集群实战之lvs负载均衡-技术流ken>中已经进行了详细的介绍和应用,在这里就不再赘述.这篇博文将把lvs与keepalived相结合 ...

  3. python的多种魔术方法

    目录 new str & repr iter getitem.setitem.delitem getattr.setattr.delattr call slots 定制类和魔法方法 new s ...

  4. idea启动springmvc项目时报找不到类

    今天用idea启动springmvc项目时找不到类 . 查了一下,发现是我使用idea20201.1出现的bug 解决方法:File>Settings>Build, Execution, ...

  5. 【转】Postgres SQL sort 操作性能调优

    这篇文章将以实战的方式结合笔者在项目中真实遇到的情况来讲解.说到SQL,大家可能会遇到一些写法稍微复杂的写法.比如SQL中遇到的有聚合函数sum等,也有遇到使用group by / order by的 ...

  6. Spring Boot(二) :Redis 使用

    Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更丰富的数据结构,例如 hashes, lists, sets 等,同时支持数据持久化.除此 ...

  7. Python-输入输出-input ouput

    输入.输出? 这种统称为IO流,也就是数据流向,在标准中,从终端输入称为标准输入 sidin,从终端输出为标准输出 stdout,从终端错误输出则为标准错误输出 stderr.这些只是IO流中终端方面 ...

  8. C#编写一个较完整的记事本程序

    开发环境 Visual Studio 2019 至少需安装 .NET桌面开发 创建项目并配置 创建窗体文件 配置项目名称及框架 设计界面 创建窗体文件,将控件摆放位置如下,参考系统自带的记事本程序 窗 ...

  9. 实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发

    一.实验目的 熟悉 Postman 的使用;熟悉如何使用 OpenDaylight 通过 Postman 下发流表. 二.实验任务 流表有软超时和硬超时的概念,分别对应流表中的 idle_timeou ...

  10. Java知识系统回顾整理01基础03变量09块

    一.定义 块:从{ 开始 到对应的} 结束,即一个块 public class HelloWorld { //类对应的块 public static void main(String[] args) ...