在django中,中间件其实就是一个类,他是一个可以介入django的 requestresponse 的钩子框架,在请求响应不同的阶段,执行类中不同的代码,用于在全局修改django的输入输出。

自定义中间件

自定义中间件有两种方式,使用函数定义,和使用类定义。

自定义中间件一般定义在项目目录或者‘应用目录下的 middleware.py 文件下。

函数定义

def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware

示例

def simple_middleware(get_response):
print("django被初始化") def middleware(request):
print("请求")
response = get_response(request)
print("响应")
return response
return middleware

访问视图执行结果

django被初始化
[20/Oct/2018 09:44:54] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应

类定义

class SimpleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def __call__(self, request):
# 此处编写的代码会在每个请求处理视图前被调用。 response = self.get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。 return response

示例

class SimpleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
print("初始化") def __call__(self, request):
print("请求") response = self.get_response(request)
print("响应") return response

访问视图执行结果

django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应

与旧版本中间件的兼容

在Django 1.10版本之前,中间件设置名为MIDDLEWARE_CLASSES,是长这样的:

class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
self.get_response = get_response def process_request(self, request):
# 此处编写的代码会在每个请求处理视图前被调用。 def process_response(self, request, response):
# 此处编写的代码会在每个请求处理视图之后被调用。 return response

示例

class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
print("django初始化")
self.get_response = get_response def process_request(self, request):
print("请求") def process_response(self, request, response):
print("响应") return response

访问视图执行结果

django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应
  • 参数get_response代表被访问的视图函数

中间件的执行顺序

中间件的执行顺序和注册顺序有关系。在视图函数处理前,会按注册顺序从上往下执行。在属兔函数处理后,会按注册顺序从上往下执行, 在初始化的时候,也是从下往上执行。

示例

定义两个中间件

def simple_middleware(get_response):
print("django被初始化") def middleware(request):
print("请求")
response = get_response(request)
print("响应")
return response
return middleware class SimpleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
print("初始化") def __call__(self, request):
print("请求") response = self.get_response(request)
print("响应") return response

注册顺序

MIDDLEWARE = [
'middleware.middleware.simple_middleware',
'middleware.middleware.SimpleMiddleware',

执行结果

初始化2
django被初始化1
请求1
请求2
视图函数
响应2
响应1

最新文章

  1. C# 判断文件有没占用
  2. sort详解2
  3. bat调用bat的一个巨坑
  4. HTML: 用表格畫出課程表
  5. 【转】shell脚本调试(bash trap support bashdb )
  6. JAVA NIO 类库的异步通信框架netty和mina
  7. MP3的频率、比特率、码率与音质的关系
  8. PHP高效的敏感词过滤方法
  9. 从原理角度解析Android (Java) http 文件上传
  10. servlet多次跳转报IllegalStateException异常
  11. Python3基础 函数 关键字参数 的示例
  12. 深度剖析HashMap的数据存储实现原理(看完必懂篇)
  13. postgrel执行VACUUM报VACUUM cannot run inside a transaction block
  14. Spring基础系列-Spring事务不生效的问题与循环依赖问题
  15. UOJ #207. 共价大爷游长沙(LCT + 异或哈希)
  16. FatFs文件系统的移植
  17. 【转】Winform程序未捕获异常解决方法 EventType clr20r3 P1
  18. Python并发编程二(多线程、协程、IO模型)
  19. C++原型模式和模板模式
  20. BZOJ3772精神污染

热门文章

  1. Multiple Database Block Sizes and the Buffer Cache
  2. 5.FileWriter 和 BufferWriter
  3. Oracle案例10——HWM(高水位线)性能优化
  4. 关于springMVC的一些xml配置
  5. C# 输入一个整数,求质因数
  6. 【matlab】 幂法 求解最大特征值
  7. CDN高级技术专家周哲:深度剖析短视频分发过程中的用户体验优化技术点
  8. Office 365实现单点登录系列(2)—Azure AD Connect安装与配置
  9. 解决Failed to load the JNI shared library xxx/xxx/jvm.dll 错误
  10. Hadoop HBase概念学习系列之HBase里的长表VS宽表VS窄表(十五)