中间件: 

  作用: 介于request和response之间的一到处理过程,相对比较轻量级,并且在全局上改变django的输入与输出,因为改变的是全局,所以需要谨慎使用,用不好会影响到性能.

当用户发送请求的时候会依次经过所有的中间件,这是红请求时process_request,最后到达views函数中,views函数处理后,会依次穿过中间件,这个时候是process_response,最后返回给请求者.

中间件的位置在settings配置,MIDDLEWARE中, 按照从上往下的顺序执行:

自定义中间件:

上图的中间件是django自带的中间件,我们也可以自定义中间件,即写一个类,但是这个类必须继承MiddlewareMixin.

此时还要在settings中的MIDDLEWARE中,最下面加上你自定义的中间件:

  ''middlewares.MD1'' ,

  ''middlewares.MD2'' , 这里的MD1和MD2是你写的类名

自定义中间件实例

  目录: 在项目中创建一个包(文件夹),随便起名字,一般我们都起名叫utils包里面,表示一个公共组件,创建一个py文件,随便起名,例如我们起名叫middlewares.py .

from django.utils.deprecation import MiddlewareMixin

class mdware(MiddlewareMixin):
  #自定义中间件,不是必须要有下面这两个方法,有request方法说明请求来了要处理,有response方法说明响应出去需要处理,不是非要写这两个方法,如果没写process_response,那么会一层一层
的往上找,那个中间件有process_response方法就返回对象给哪个中间件
def process_request(self,request):
print('md1中的 process_request') def process_response(self,request,response):
print('md2中的 process_response')
     return response
     #此时必须要return response, 这里类比于跑接力的接力棒

  process_request

  process_request有一个参数,就是request,这个request和视图函数中的request是一样的,如果没有返回值,就按照正常流程走,如果返回了一个Httpresponse,django将不会执行视图函数,而将对应的Httpresponse对象返回给浏览器.

from django.utils.deprecation import MiddlewareMixin

class md1(MiddlewareMixin):
def process_request(self,request):
print(" md1中的process_request") class md2(MiddlewareMixin):
def process_request(self,request):
print("md2中的process_request ")

  process_response

  process_response有两个参数,一个是request,另一个是response , request和之前是一样的,response是视图函数返回的Httpresponse对象,该方法的返回值也必须是Httpresponse对象.

from django.utils.deprecation import MiddlewareMixin

class MD1(MiddlewareMixin):
def process_request(self,request):
print('MD1中的process_request') def process_response(self,request,response): #request和response两个参数必须有
print('MD1中的process_response')
return Httpresponse('ojbk') class MD2(MiddlewareMixin):
def process_request(self,request):
print('MD2中的process_request') def process_response(self,request,response):
print('MD1中的process_response')
return response #必须返回response,不然上层中间件没有拿到HTTPresponse对象,会报错

  

day062 中间件的更多相关文章

  1. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  2. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

  3. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...

  4. ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...

  5. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  8. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  9. ASP.NET Core的路由[4]:来认识一下实现路由的RouterMiddleware中间件

    虽然ASP.NET Core应用的路由是通过RouterMiddleware这个中间件来完成的,但是具体的路由解析功能都落在指定的Router对象上,不过我们依然有必要以代码实现的角度来介绍一下这个中 ...

随机推荐

  1. ZooKeeper是什么

    ZooKeeper概念 相信大家对 ZooKeeper 应该不算陌生,但是你真的了解 ZooKeeper 是什么吗?如果别人/面试官让你讲讲 ZooKeeper 是什么,你能回答到哪个地步呢? 本人曾 ...

  2. linux之tree命令

    linux下tree命令的用法解释 2018年03月22日 ⁄ RakSmart教程 ⁄ 共 583字 ⁄ 字号 小 中 大 ⁄ linux下tree命令的用法解释已关闭评论 tree命令,主要功能是 ...

  3. meterpreter 渗透用法

    获取凭证 hashdump模块(post)可以从SAM数据库中导出本地用户账号,credential_collector脚本(post/windows/gather/credentials)也可以从目 ...

  4. 记账本微信小程序开发五

    准备做首页和分页 准备一些图标的图,用ps或者用创客贴都欧克 建图片的文件夹和首页的编辑

  5. 51Nod 1174 区间中最大的数

    给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少.   例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...

  6. wrap

    import 'package:flutter/material.dart'; void main() { runApp(MaterialApp(home: new MyApp())); } clas ...

  7. Unable to execute 'doFinal' with cipher instance

    今天项目启动后登录项目,突然爆出Unable to execute 'doFinal' with cipher instance错误.清除cookie登录测试,又不报错了,以前也见过类似问题,因为不影 ...

  8. Docker+Consul+Registrator 实现服务注册与发现

    Docker+Consul+Registrator实现服务注册与发现 逻辑图 实现nginx节点自动化加入容器IP代理 1.三台Consul agent server作为高可用通过Consul Tem ...

  9. 算法(第四版)C# 习题题解——1.2

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 ...

  10. Centos 查看 CPU 核数 和 型号 和 主频

    cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c     10  Intel(R) Xeon(R) CPU E5-2430 v4 @ 2.10 ...