• day59 django生命周期 中间件 csrf跨站请求伪造 auth模块 settings功能插拔式源码


    django生命周期

     django中间件

    django中间件是类似于是django的保安
    请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models)
    响应走的时候也需要经过中间件才能到达web服务网关接口
                

    django默认的七个中间件

    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',
    ]

    django中间件中有五个用户可以自定义的方法

    掌握
    1.process_request()方法
    2.process_response()方法
    了解
    3.process_view()
    4.process_exception()
    5.process_template_response()

    django中间件可以用来做什么

    1.网站全局的身份校验,访问频率限制,权限校验...只要是涉及到全局的校验你都可以在中间件中完成 
    2.django的中间件是所有web框架中 做的最好的

    1.process_request()方法

    测试:

    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',
            'folder.foo.MyFile',
            'folder.foo.MyFile1',
            'folder.foo.MyFile2',
        ]
    在settings.py 中间件中添加

    在列表中新创一个文件夹folder,新建文件foo

    from django.utils.deprecation import MiddlewareMixin
    
    
        class MyFile(MiddlewareMixin):
            def process_request(self,request):
                print('第一个process_request方法')
    
    
    
        class MyFile1(MiddlewareMixin):
            def process_request(self,request):
                print('第二个process_request方法')
    
    
        class MyFile2(MiddlewareMixin):
            def process_request(self,request):
                print('第三个process_request方法')
    foo

    在urls.py中添加相应路由

    url(r'^index/', views.index)
    路由

    在views.py

    from django.shortcuts import render,HttpResponse
    
        def index(request):
            print('我是index的视图函数')
            return HttpResponse('index')
    views.py

    规律:

    1.请求来的时候 会经过每个中间件里面的process_request方法(从上往下)
    2.如果方法里面直接返回了HttpResponse对象 那么会直接返回 不再往下执行,会跳到同级别的process_response方法
    基于该特点就可以做访问频率限制,身份校验,权限校验

     补充:

    在flask中间件中,他在走的时候,无论你在哪个中间件中返回HTTPResponse对象,都会掉头重新走process_response对象
    在django中,是在同级别中走process_response对象

    验证:

    在第二个类中,返回HTTPResponse对象
    class MyFile1(MiddlewareMixin):
        def process_request(self,request):
            print('第二个process_request方法')
            return HttpResponse('hahahhahhahhahhah')
    
        def process_response(self,request, response):
            print('第二个process_response方法')
            return response
    验证

    结果:

    第一个process_request方法
    第二个process_request方法
    第二个process_response方法
    第一个process_response方法

    2.process_response()

    from django.utils.deprecation import MiddlewareMixin
    
    
        class MyFile(MiddlewareMixin):
            def process_request(self,request):
                print('第一个process_request方法')
    
    
    
            def process_response(self,request,response):
                print('第一个process_response方法')
                return response
    
    
        class MyFile1(MiddlewareMixin):
            def process_request(self,request):
                print('第二个process_request方法')
    
            def process_response(self,request, response):
                print('第二个process_response方法')
                return response
    
        class MyFile2(MiddlewareMixin):
            def process_request(self,request):
                print('第三个process_request方法')
    
            def process_response(self,request,response):
                print('第三个process_response方法')
                return response
    代码

    规律

    1.必须将response形参返回 因为这个形参指代的就是要返回给前端的数据
    2.响应走的时候 会依次经过每一个中间件里面的process_response方法(从下往上)

     3.process_view()

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class MyFile(MiddlewareMixin):
        def process_request(self,request):
            print('第一个process_request方法')
    
    
    
        def process_response(self,request,response):
            print('第一个process_response方法')
            return response
    
        def process_view(self,request,view_func,view_args,view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第一个process_view方法')
    
    class MyFile1(MiddlewareMixin):
        def process_request(self,request):
               print('第二个process_request方法')
            # return HttpResponse('hahahhahhahhahhah')
    
        def process_response(self,request, response):
            print('第二个process_response方法')
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第二个process_view方法')
    
    
    class MyFile2(MiddlewareMixin):
        def process_request(self,request):
            print('第三个process_request方法')
    
        def process_response(self,request,response):
            print('第三个process_response方法')
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第三个process_view方法')
    代码

    结果:

    第一个process_request方法
    第二个process_request方法
    第三个process_request方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第一个process_view方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第二个process_view方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第三个process_view方法
    我是index的视图函数
    第三个process_response方法
    第二个process_response方法
    第一个process_response方法
    结果

    规律

    1.在路由匹配成功执行视图函数之前 触发

    4.process_exception()

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class MyFile(MiddlewareMixin):
        def process_request(self,request):
            print('第一个process_request方法')
    
        def process_response(self,request,response):
            print('第一个process_response方法')
            return response
    
        def process_view(self,request,view_func,view_args,view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第一个process_view方法')
    
        def process_exception(self,request,exception):
            print('第一个process_exception方法')
    
    class MyFile(MiddlewareMixin):
        def process_request(self,request):
            print('第二个process_request方法')
    
        def process_response(self,request,response):
            print('第二个process_response方法')
            return response
    
        def process_view(self,request,view_func,view_args,view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第二个process_view方法')
    
        def process_exception(self,request,exception):
            print('第二个process_exception方法')
    
    class MyFile(MiddlewareMixin):
        def process_request(self,request):
            print('第三个process_request方法')
    
        def process_response(self,request,response):
            print('第三个process_response方法')
            return response
    
        def process_view(self,request,view_func,view_args,view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第三个process_view方法')
    
        def process_exception(self,request,exception):
            print('第三个process_exception方法')
    代码

    结果:

    第一个process_request方法
    第二个process_request方法
    第三个process_request方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第一个process_view方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第二个process_view方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第三个process_view方法
    我是index的视图函数
    第三个process_response方法
    第二个process_response方法
    第一个process_response方法
    [25/Sep/2019 21:16:54] "GET /index/ HTTP/1.1" 200 5
    结果

    不会触发

    条件:

    def index(request):
        print('我是index的视图函数')
        123456321
        return HttpResponse('index')
    条件

    显示

    第一个process_request方法
    Traceback (most recent call last):
    第二个process_request方法
    第三个process_request方法
      File "E:libsite-packagesdjangocorehandlersexception.py", line 41, in inner
    <function index at 0x0000000003F5E268>
        response = get_response(request)
    ()
    {}
      File "E:libsite-packagesdjangocorehandlersase.py", line 187, in _get_response
    第一个process_view方法
    <function index at 0x0000000003F5E268>
        response = self.process_exception_by_middleware(e, request)
    ()
    {}
      File "E:libsite-packagesdjangocorehandlersase.py", line 185, in _get_response
    第二个process_view方法
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
    <function index at 0x0000000003F5E268>
    ()
      File "D:untitled_djangoday59app01views.py", line 6, in index
    {}
        serdtguyjiokpl
    第三个process_view方法
    我是index的视图函数
    NameError: name 'serdtguyjiokpl' is not defined
    第三个process_exception方法
    第二个process_exception方法
    第一个process_exception方法
    [25/Sep/2019 21:45:35] "GET /index/ HTTP/1.1" 500 63493
    第三个process_response方法
    第二个process_response方法
    第一个process_response方法
    显示

    规律:

    1.当你的视图函数报错时 就会自动执行

     

     5.process_template_response()

     代码

    from django.utils.deprecation import MiddlewareMixin
    
    class MyFile(MiddlewareMixin):
        def process_request(self,request):
            print('第一个process_request方法')
    
        def process_response(self,request,response):
            print('第一个process_response方法')
            return response
    
        def process_view(self,request,view_func,view_args,view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第一个process_view方法')
    
        def process_exception(self,request,exception):
            print('第一个process_exception方法')
    
        def process_template_response(self,request,response):
            print('第一个process_template_response方法')
            return response
    
    
    
    class MyFile1(MiddlewareMixin):
        def process_request(self,request):
            print('第二个process_request方法')
    
        def process_response(self,request, response):
            print('第二个process_response方法')
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第二个process_view方法')
    
    
    
        def process_exception(self,request,exception):
            print('第二个process_exception方法')
    
        def process_template_response(self, request, response):
            print('第二个process_template_response方法')
            return response
        #
    
    class MyFile2(MiddlewareMixin):
        def process_request(self,request):
            print('第三个process_request方法')
    
        def process_response(self,request,response):
            print('第三个process_response方法')
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print(view_func)
            print(view_args)
            print(view_kwargs)
            print('第三个process_view方法')
    
    
        def process_exception(self,request,exception):
            print('第三个process_exception方法')
    
        def process_template_response(self, request, response):
            print('第三个process_template_response方法')
            return response
    代码

    不会触发:

    第一个process_request方法
    第二个process_request方法
    第三个process_request方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第一个process_view方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第二个process_view方法
    <function index at 0x0000000003F5E268>
    ()
    {}
    第三个process_view方法
    我是index的视图函数
    第三个process_response方法
    第二个process_response方法
    第一个process_response方法
    [25/Sep/2019 21:27:02] "GET /index/ HTTP/1.1" 200 5
    
     
    显示

    条件:

    def index(request):
        print('我是index视图函数')
        def render():
            return HttpResponse('什么鬼玩意')
        obj = HttpResponse('index')
        obj.render = render
        return obj
    条件

    规律:

    1.当你返回的HttpResponse对象中必须包含render属性才会触发

    自定义中间件,研究这上面五个方法都有哪些特点

    1.如果你想让你写的中间件生效 就必须要先继承MiddlewareMixin
    2.在注册自定义中间件的时候 一定要确保路径不要写错
    
     
    View Code

  • 相关阅读:
    第 15 章 标签页和工具提示插件
    第 14 章 下拉菜单和滚动监听插件
    第 13 章 模态框插件
    第 12 章 列表组面板和嵌入组件
    第 11 章 进度条媒体对象和 Well 组件
    第 10 章 巨幕页头缩略图和警告框组件
    第 9 章 路径分页标签和徽章组件
    lock()与lockInterruptibly()的区别
    MySQL中Innodb的聚簇索引和非聚簇索引
    MySQL使用可重复读作为默认隔离级别的原因
  • 原文地址:https://www.cnblogs.com/komorebi/p/11586216.html
Copyright © 2020-2023  润新知