Django中间件

Django中间件的定义:

中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。

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

自定义中间件:

1.process_request(self,request)

2.process_view(self, request, view_func, view_args, view_kwargs)

3.process_template_response(self,request,response)

4.process_exception(self, request, exception)

5.process_response(self, request, response)

以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

中间件------------------------>>>>>>>>>>>>>
    中间件是一个用来处理django的响应与请求的框架级别的钩子.它是一个轻量,低级别的插件系统,
    用于在全局范围内改变django的输入和输出,每个中间件组件都负责做一些特定的功能.
    
    ----简单来说,Django的中间件是一个类。用来在全局范围内处理请求和响应。
    
    process_request(self,request)
    process_view(self, request, view_func, view_args, view_kwargs)
    process_template_response(self,request,response)
    process_exception(self, request, exception)
    process_response(self, request, response)
    
    1. process_request
        1. 执行时间
            在视图函数之前执行
        2. 参数
            request 和视图中的request是同一个
        3. 返回值
            返回None  
            返回response对象   
                不执行后面中间的process_request方法和视图
                直接执行当前值中间件的process_response方法
        4. 执行顺序
            按照注册的顺序执行 
            
            
    2. process_response    
        1. 执行时间    
            在视图函数之后执行
        2. request, response
            request 和视图中的request是同一个
            response 返回的response对象
        3. 返回值
            返回response对象
        4. 执行顺序
            按照注册的倒序执行
    
    
    3. process_view
        1. 执行时间
            在视图函数之前,process_request之后执行
        2. 参数
            view_func  将要执行的视图函数
            view_args  视图函数的可变长位置参数
            view_kwargs    视图函数的可变长关键字参数
        3. 返回值
            返回  None  正常执行 
            返回  response对象   不执行后面的process_view和视图,直接执行所有中间件的process_response方法
            
        4。执行顺序
            按照注册的顺序执行
    
    4. process_exception(有条件触发:有错误才执行)
                1. 执行时间
                    在视图函数之后,process_response之前执行
                2. 参数
                    exception  错误对象
                3. 返回值
                    返回  None  不对错误进行处理,交给下一个中间件进行处理
                    返回  response对象  下一个中间的process_exception不执行,直接执行所有中间件的process_response方法
                4. 执行顺序
                    按照注册的倒序执行
    5. process_template_response(条件触发:视图返回的response有render方法)
        1. 执行时间
            在视图函数之后,process_response之前执行
        2. 参数
        3. 返回值
            返回 response对象
        4. 执行顺序
            按照注册的倒序执行,执行完所有的process_template_response方法后执行response.render方法

  

上面中间件的流程:

 

 

"""
自定义的中间件
"""
# 中间件只能返回None 和 HttpResponse

from django.utils.deprecation import MiddlewareMixin

class MyMiddle1(MiddlewareMixin):

	def process_request(self, request):
		print("开始第一个中间件")

	def process_view(self,request,view_func,view_args,view_kwargs):
		print("第一个process_view")
		print(view_func,type(view_func))   #函数的对象

	def process_response(self, request,response):
		print("结束第一个中间件")
		return response
class MyMiddle2(MiddlewareMixin):

	def process_request(self, request):
		print("开始第二个个中间件")
		# return HttpResponse("98k")

	def process_view(self,request,view_func,view_args,view_kwargs):
		print("第二个process_view")
		print(view_func,type(view_func))   #函数的对象
		# return HttpResponse("oo98k")
	def process_response(self, request,response):
		print("结束第二个中间件")
		return response
	
	
	'''
	url(r'^see_author/', views.see_author),
	
	开始第一个中间件
	开始第二个个中间件
	第一个process_view
	<function see_author at 0x000000000B74F378> <class 'function'>
	第二个process_view
	<function see_author at 0x000000000B74F378> <class 'function'>
	结束第二个中间件
	结束第一个中间件
	'''

在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
]

  

详细点我

原文地址:https://www.cnblogs.com/zenghui-python/p/11073483.html