zoukankan      html  css  js  c++  java
  • 中间介(MiddleWare)

     引子-Django的生命周期

    在学习中间介之前,我们先来回顾一下Django的生命周期:用户发起请求,请求会被发送到urlconf中的url,然后会指向对应的views函数进行处理,views函数处理完成后,用模板渲染好html,然后返回给用户的浏览器。

    加上中间介的流程如下:

    在Django中的setttings文件有配置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',
    ]

    执行顺序从上到下。

    自定义中间介

    1、自定义中间介

    新建一个名为middle的包,下面新建文件md.py,

    内容如下:

    from django.utils.deprecation import MiddlewareMixin
    
    class MD1(MiddlewareMixin):
        def process_request(self,request):
            print "MD1 process_request"
    
        def process_response(self,request,response):
            print "MD1 process_response"
            return response
    
    
    class MD2(MiddlewareMixin):
        def process_request(self,request):
            print "MD2 process_request"
    
        def process_response(self,request,response):
            print "MD2 process_response"
            print response
            return response
    

      

    2、setttings文件配置

    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',
        'middle.md1.MD1',
        'middle.md1.MD2',
    ]
    

      

    3、视图函数

    views.py

    def md(request):
        print "views function"
        return HttpResponse('execute view function')
    

      

    4、urls.py文件

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),
        url(r'^mf/', views.mf),
        url(r'^fm/', views.fm),
        url(r'^myform/', views.myform),
        url(r'md',views.md),
    
    ]
    

     

    5、访问URL

    浏览器返回视图函数的内容:

    后台执行:

    中间介依次执行,

    MD1的process_request,MD2的process_request
    MD2的process_response,MD1的process_response

    中间介的response值为视图函数的返回值。

     

     

     

     

    class MD1(MiddlewareMixin):
        def process_request(self,request):
            print "MD1 process_request"
    #process_request函数有返回值时,会直接返回给用户,而不往下执行。 return HttpResponse('MD1 process_request') def process_response(self,request,response): print "MD1 process_response" return response

      

    执行结果为:

     

    多个middleware的整体执行流程如下:

     

     

    MiddlewareMixin函数

    源码

    class MiddlewareMixin(object):
        #构造函数执行父类的构造函数
        def __init__(self, get_response=None):
            self.get_response = get_response
            super(MiddlewareMixin, self).__init__()
    
        def __call__(self, request):
            response = None
            #如果当前中间介有process_request方法,则执行
            if hasattr(self, 'process_request'):
                response = self.process_request(request)
            #如果当前中间介没有process_request方法,则执行下一个中间介的__call__(),依次循环执行下去
            if not response:
                response = self.get_response(request)
            #执行当前中间介的process_reponse方法
            if hasattr(self, 'process_response'):
                response = self.process_response(request, response)
            return response
    

      7、8、9版本里面process_request和process_response方法都是必须写的,10版本以后可以不写,但是为了过渡,最好写上。

     每个中间介,可能只有process_request,也可能只有process_response方法。

     

    总结

    中间介整体执行流程

     

    中间介应用场景

    对于所有的用户统一的请求都需要处理,这时就需要中间介可以搞定,如果是部分用户请求,可以用装饰器进行处理。

    csrf是通过判断request的header里面是否有csrf参数。

     

    最常用的方法

    process_request

    因为process_request方法可以在用户请求时,做统一的操作非常方便、灵活,比如设置白名单。

     

  • 相关阅读:
    YL杯超级篮球赛 (Standard IO)
    Window (Standard IO)
    toj1026 Network 双连通分量
    poj3177 Redundant Paths 双连通分量
    poj1144 Network 双连通分量
    bzoj1269
    bzoj1800
    CF911D
    CF910C
    CF910B
  • 原文地址:https://www.cnblogs.com/skyflask/p/9823498.html
Copyright © 2011-2022 走看看