中间件

"""
如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

大家可能频繁在view使用request.user吧。 Django想在每个view执行之前把user设置为request的属性,于是就用了一个中间件来实现这个目标。
所以Django提供了可以修改request 对象的中间件 AuthenticationMiddleware。

"""

#(一)
# 定义中间件
# 项目/middleware/mymiddleware.py
# 需要导入:
from django.utils.deprecation import MiddlewareMixin
# 自定义中间件必须要继承MiddlewareMixin
class MyMiddleware(MiddlewareMixin):
    #中间件中一共有四个方法:
    # process_request       #  请求
    #
    # process_view         #  视图
    #
    # process_exception    #  报错
    #
    # process_response    #  响应

    # 四中方法大概流程为:例如:两个自定义中间件,每个中间件中自定义了四种方法
    # 流程为: 请求(1-2) --> url路由关系映射 --> 视图(1-2) --> 视图函数 --> 报错(2-1) --> 响应(2-1)

    # 注意process_request方法:
    # 当请求有返回值时:如果当请求到达请求1的时候直接不符合条件返回,即return HttpResponse("Md1中断"),程序将把请求直接发给中间件1返回,返回到请求者,即 请求 -- > 响应
    # 当请求无返回值,或返回 None 时,则依次往下执行中间件流程

    # 注意process_view方法:
    # process_view可以用来调用视图函数
    '''
        def process_view(self, request, callback, callback_args, callback_kwargs):
            # return HttpResponse("hello")
            response=callback(request,*callback_args,**callback_kwargs)
            return response
    '''
    # process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。 即 请求 --> 视图 --> 响应

    # 注意process_response方法:
    # 必须要返回 response 响应

    # 四大方法的基本格式:
    '''
    def process_request(self,request):
        print("Md1请求")
        #return HttpResponse("Md1中断")
    def process_response(self,request,response):
        print("Md1返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        # return HttpResponse("hello")
        # response=callback(request,*callback_args,**callback_kwargs)
        # return response
        print("md1 process_view...")
    def process_exception(self):
        print("md1 process_exception...")
    '''

# 最常用的模式是:请求 -- > 视图函数处理 -- > 响应
# 当用户发起请求的时候会依次经过所有的的中间件,这个时候请求先经过process_request方法,最后到达views的函数中,
# views函数处理后,在依次穿过中间件,这个时候经过process_response,最后返回给请求者。
# 若对响应没有操作可以不写,即 只有 process_request 方法



#(二)
# 在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',
    '项目.middleware.mymiddleware.MyMiddleware',  # 中间件路径.自定义中间件类名
]
'''

流程图:

 

这样当用户发起请求的时候到达中间件3的process_request之后会到达urls路由关系映射这里,如果匹配到了就会到中间件1的process_view,然后依次传递到中间件3的process_view,到达view函数。如果view函数中有报错,则会从中间件3依次向上判断每个中间件的process_exception是否能匹配到这个错误信息,如果匹配到则直接返回到最后一个中间件,这里即中间件3的process_response,然后依次返回到用户,如果没有匹配到这个错误则直接在页面显示错误信息。如果view函数中没有错误,则到中间3即最后一个中间件3的process_response,然后依次向上,传到用户。

 

中间件之process_template_responseprocess

process_template_response(self,request,response)

只有当views函数中返回的对象中具有render方法,才会被调用。

 

posted @ 2018-02-01 11:08  JAYWX  阅读(88)  评论(0编辑  收藏  举报