一,中间件介绍

  1.什么是中间件?

    中间件是一个用来处理Django的请求和响应的框架级别的钩子(函数)。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

    但是由于其影响的时全局,所以需要谨慎使用,使用不当会影响性能。

    中间件事帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定时间去执行这些方法。

  

  2.Django项目中的settings.py文件的MIDDLEWARE配置项:

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',   'middlewares.MD1',  #自定义中间件MD1   'middlewares.MD2',  #自定义中间件MD2]

    MIDDLEWARE配置项是一个列表,列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。

二,Django中自定义中间件

  1.五个方法(执行的时间点、执行的顺序、参数、返回值)

    1.process_request

      有一个参数,就是request,这个request和视图函数中的request是一样的。

process_request(self,request)  *****0.执行的时间点收到请求的时候,执行视图函数之前执行的1.执行顺序:1.按照中间件的注册顺序执行2.参数当前请求对象3.返回值1.返回None继续执行后续的2.返回响应对象,直接返回响应,不继续执行后续的是视图函数

from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self, request):print("MD1里面的 process_request")class MD2(MiddlewareMixin):def process_request(self, request):print("MD2里面的 process_request")pass

 

   

    2.process_response

      response是视图函数返回的HttpResponse对象。该方法的返回值也必须是HttpResponse对象

process_response(self,request,response)  *****0.执行的时间点:返回响应之后1.执行顺序按照中间件的注册倒序执行2.参数1.request:当前的请求对象2.response:传递过来的响应对象3.返回值1.必须返回一个响应对象

from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self, request):print("MD1里面的 process_request")def process_response(self, request, response):print("MD1里面的 process_response")return responseclass MD2(MiddlewareMixin):def process_request(self, request):print("MD2里面的 process_request")passdef process_response(self, request, response):print("MD2里面的 process_response")return response

    3.process_view

      该方法有四个参数:

        view_func是Django即将使用的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)

        view_args是将传递给视图的位置参数的列表

        view_kwargs是将传递给视图的关键字参数的字典。view_args和view_kwargs都不包含第一个视图参数(request)

      如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

process_view(self,request,view_func,view_args,view_kwargs)0.执行的时间点:process_request之后,视图函数之前执行1.执行顺序:按照注册的顺序执行2.参数1.request:请求对象2.view_func:将要执行的视图函数对象3.view_args/view_kwargs:将要执行的函数的参数3.返回值1.None:继续往后执行2.响应对象:直接返回了,不会执行后续的视图函数

from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self, request):print("MD1里面的 process_request")def process_response(self, request, response):print("MD1里面的 process_response")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("-" * 80)print("MD1 中的process_view")print(view_func, view_func.__name__)class MD2(MiddlewareMixin):def process_request(self, request):print("MD2里面的 process_request")passdef process_response(self, request, response):print("MD2里面的 process_response")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("-" * 80)print("MD2 中的process_view")print(view_func, view_func.__name__)

  4.process_exception

    exception参数是视图函数异常产生的Exception对象。这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

process_exception(self,request,exception)0.执行的时间点当视图函数中抛出异常的时候才会执行这个方法1.执行顺序:注册的倒序2.参数:1.request:请求对象2.exception:视图函数抛出的异常3.返回值:1.None:继续执行后续2.响应对象:直接返回

from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self, request):print("MD1里面的 process_request")def process_response(self, request, response):print("MD1里面的 process_response")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("-" * 80)print("MD1 中的process_view")print(view_func, view_func.__name__)def process_exception(self, request, exception):print(exception)print("MD1 中的process_exception")     return HttpResponse(str(exception))class MD2(MiddlewareMixin):def process_request(self, request):print("MD2里面的 process_request")passdef process_response(self, request, response):print("MD2里面的 process_response")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("-" * 80)print("MD2 中的process_view")print(view_func, view_func.__name__)def process_exception(self, request, exception):print(exception)print("MD2 中的process_exception")

    想办法,在视图函数中抛出一个异常:

def index(request):print("app01 中的 index视图")raise ValueError("呵呵")return HttpResponse("O98K")

  5.process_template_response

    它其中一个的参数,response是TemplateResponse对象(有视图函数或者中间件产生)。

    它是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法

process_template_response(self,request,response)0.执行的时间点当视图函数中返回带render方法的响应对象,这个方法才会执行1.执行顺序:注册的倒序2.参数1.request:请求对象2.response:响应对象3.返回值1.必须返回响应对象

class MD1(MiddlewareMixin):def process_request(self, request):print("MD1里面的 process_request")def process_response(self, request, response):print("MD1里面的 process_response")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("-" * 80)print("MD1 中的process_view")print(view_func, view_func.__name__)def process_exception(self, request, exception):print(exception)print("MD1 中的process_exception")return HttpResponse(str(exception))def process_template_response(self, request, response):print("MD1 中的process_template_response")return responseclass MD2(MiddlewareMixin):def process_request(self, request):print("MD2里面的 process_request")passdef process_response(self, request, response):print("MD2里面的 process_response")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("-" * 80)print("MD2 中的process_view")print(view_func, view_func.__name__)def process_exception(self, request, exception):print(exception)print("MD2 中的process_exception")def process_template_response(self, request, response):print("MD2 中的process_template_response")return response

    views.py中:

def index(request):print("app01 中的 index视图")def render():print("in index/render")return HttpResponse("O98K")rep = HttpResponse("OK")rep.render = renderreturn rep

三,Django请求流程

 

          

      

转载于:https://www.cnblogs.com/lianyeah/p/9959146.html

day68 Django--中间件相关推荐

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

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

  2. 利用django中间件CsrfViewMiddleware防止csrf攻击

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...

  3. 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS

    1 https协议 https://www.cnblogs.com/superfeeling/p/11561340.html https://www.cnblogs.com/an-wen/p/1118 ...

  4. django 中间件的使用

    django 中间件的使用 Django 在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下: (1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次 ...

  5. 【python】-- Django 中间件、缓存、信号

    Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...

  6. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  7. Django - 中间件

    Django - 中间件 一. 什么是中间件 官方: 中间件是一个用来处理Django的请求和相应的框架级别的钩子, 他是一个轻量, 低级别的插件系统, 用于在全局范围内改变Django的输入和输出, ...

  8. Django中间件与python日志模块 介绍

    一.Django中间件 1.1 介绍 Django中的中间件是一个轻量级.底层的插件系统,介于request与response处理之间的一道处理过程(用来处理特定业务的请求和响应).中间件的设计为开发 ...

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

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

  10. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

最新文章

  1. ndbcluster 批量修改表空间_Excel小技巧:使用这招快速保护你的工作表
  2. 科研文献|常见豆类根际的持久微生物组成员:空间、时间和植物基因型的综合分析
  3. Altium designer关于铺铜的操作
  4. MyBatis架构设计及源代码分析系列(一):MyBatis架构
  5. 蓝桥杯java第八届第一题--购物单
  6. 数据结构:利用栈,将递归转换为非递归的方法
  7. ABP Framework V4.4 RC 新增功能介绍
  8. c++——reverse()函数的使用
  9. 基于github和hexo搭建博客 本地hexo博客搭建
  10. Java泛型初探————泛型通配
  11. w10电脑c盘满了怎么清理_Win10专业版电脑c盘满了怎么清理?教你一招快速清理C盘...
  12. 嵌入式通过绑定实现双网卡冗余
  13. 产品研发管理(二):使用SubVersion进行代码管理
  14. 学python能赚钱吗-做直播能有多赚钱,Python告诉你
  15. windowspython专用装B代码
  16. 湘潭大学计算机分数线,湘潭大学录取分数线2021是多少分(附历年录取分数线)
  17. 求刷百度相关词的方法
  18. MySQL远程连接失败(错误码:2003)
  19. macOS上如何通过.crash文件定位崩溃地址
  20. ERROR Deployer not found: git

热门文章

  1. vscode 解决 无法打开 chrome
  2. 比较好用的两款免费音频(视频)格式转换、处理软件
  3. markdown好看的模板
  4. Java项目:教师资格证报名系统(java+SpringBoot+vue+maven+mysql+elementui)
  5. NVIDA CUDA和cuDNN安装教程
  6. 【毕业设计】基于STM32的心率检测器 - 单片机 嵌入式 物联网
  7. jnz和djnz_单片机指令
  8. 第一篇博文 开启我的互联网世界【立志学好C语言的兵哥哥】
  9. html蔡徐坤邀请你打篮球源码,蔡徐坤给IKUN“讲笑话”,想邀请粉丝打篮球,网友:你打球像...
  10. ubuntu14.04的自带的拼音输入法问题