标签:rect 定义 规则 bar one app gem bsp http
官方说法 :中间件就是一个出来Django的请求和响应的框架级别的钩子。它是一个轻量级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件负责做一些特定的功能
但是由于其影响的是全局,所以需要谨慎似乎用,使用不当会影响性能
说得直白一点 中间件是帮助我们在视图函数执行之前和执行之后 都可以做一些额外的操作,它本质就是一个自定义类,类中定义了几个方法,Django框架会在出来请求的特定的时间去执行这些方法
其实就是定义一个全局的装饰器 这个装饰器用来装饰你的视图函数的
我们一直都在使用中间件,只是没有注意到而已,打开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‘, ]
MIDDLEWARE配置项是一个列表,列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。
我们之前已经接触过一个csrf相关的中间件了?我们一开始让大家把他注释掉,再提交post请求的时候,就不会被forbidden了,后来学会使用{%csrf_token%}之后就不再注释这个中间件了。
那接下来就学习中间件中的方法以及这些方法什么时候被执行。
中间件可以定义五个方法,分别是(pricess_request、process_views、process_template、process_exception、process_response)
以上的方法的返回值可以是None或者一个HttpResponse对象,如果是None,则按照Django定义的规则向后继续执行,如果是HttpResponse对象,则直接将对象返回给用户
首先你要在你的Django种开辟的app种建立一个存放中间件的py文件,然后导入中间件需要的模块
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,redirect ,HttpResponse from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self,request): #request的执行是在视图函数之前先执行这个 print(‘我是MD1的process_request‘) def process_response(self,request,response): # 这个时候你的response是接收过来的是可能另外一个中间件传递过来的 那么你就要把它接收过来 print(‘我是MD1的process_response‘) return response #然后把你接收的response传递出去 给下一个中间件或者视图函数
中间件你要自定一个类然后在你的 类中根据你的需求对你的类设计这个五个方法, 然后把这个类导入你的settings种
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‘, ‘once.middlewares.MD1‘, # 导入你的once中的middlewares中自定义的中间件 MD1 ‘once.middlewares.MD2‘, # 导入你的once中的middlewares中自定义中间件MD2 ]
process_request :
process_request有一个参数,就是reqeust,这个request和视图函数中的request是一样的,
它的返回值可以是None也可以是HttpResponse对象。返回值是None的话 按照正常流程继续往下走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数 而将响应对象返回给浏览器
我们来看看多个中间件时,Django是如何执行其中的process_request方法的。
中间件
from django.shortcuts import render,redirect ,HttpResponse from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self,request): #request的执行是在视图函数之前先执行这个 print(‘我是MD1的process_request‘) def process_response(self,request,response): # 这个时候你的response是接收过来的是可能另外一个中间件传递过来的 那么你就要把它接收过来 print(‘我是MD1的process_response‘) return response #然后把你接收的response传递出去 给下一个中间件或者视图函数 class MD2(MiddlewareMixin): def process_request(self,reqeust): print(‘是MD2的process_request‘)
通过执行可以看到
通过以上两幅图就可以得到 request是在视图函数执行之前执行的
标签:rect 定义 规则 bar one app gem bsp http
原文地址:https://www.cnblogs.com/zhaoyunlong/p/9348367.html