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:\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
<function index at 0x0000000003F5E268>
    response = get_response(request)
()
{}
  File "E:\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
第一个process_view方法
<function index at 0x0000000003F5E268>
    response = self.process_exception_by_middleware(e, request)
()
{}
  File "E:\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
第二个process_view方法
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
<function index at 0x0000000003F5E268>
()
  File "D:\untitled_django\day59\app01\views.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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

\

 

转载于:https://www.cnblogs.com/komorebi/p/11586216.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值