Django重点 ---- 中间件

目  录

  • Django中间件简介

  • 自定义中间件的5种方法

  • 中间件的执行流程(待总结)

  • 跨站请求伪造

      •  钓鱼网站简介         钓鱼网站原理       钓鱼网站破解      案例

  • 装饰器

中间件前戏图解

一、Django中间件简介

什么是中间件?

Django中间件是一个低级、轻量级的插件系统,用来处理django请求和响应的框架级别的钩子。

中间件用于在全局范围内改变django的输入和输出,每个中间件组件都负责特定的功能。

中间件的应用场景:

django中间件(******)
    用户访问频率限制
    用户是否是黑名单 白名单
    所有用户登录校验
    只要是涉及到网址全局的功能 你就应该考虑使用中间件

总结:

  中间件是帮助我们在视图函数执行前和执行后做一些额外的操作。

中间件的本质就是自定义的类,类中定义了几个方法,django框架的请求在特定的时间会触发这些方法!!!

二、自定义中间件的5种方法

django中间件暴露给我们5个自定义的方法,想要自定义中间件需要以下操作:

  django中间件暴露给程序员五个可以自定义的方法(五个方法都是在特定的条件下自动触发的)
        1.新建一个文件夹 里面新建一个任意名称的py文件
        里面写类 固定继承
        from django.utils.deprecation import MiddlewareMixin
        class MyMiddle(MiddlewareMixin):
            ...
        2.去配置文件注册到中间件配置中
            你需要手写字符串的路径
             'app01.mymiddleware.myaabb.MyMiddle1'

5个方法:

 需要掌握的
            process_request(******):请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了 会执行同一级别的process_response
                    def process_request(self,request):
                        print('我是第一个自定义中间件里面的process_request方法')
                        return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值")  # 直接原地返回
            process_response(***):响应走的时候 会从下往上依次进过每一个中间件里面的process_response
                    def process_response(self,request,response):  # response就是要返回给用户的数据
                        print("我是第一个自定义中间件里面的process_response方法")
                        return response
        了解的
            process_view:路由匹配成功之后执行视图函数之前触发
            process_exception:当视图函数出现异常(bug)的时候自动触发
            process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发

 总结:Django中间件5种方法

process_request

1、中间件中 process_request 方法是在视图函数之前执行的;

2、当配置多个中间件时,会按照MIDDLEWARE中中间件的注册顺序执行;

3、多个中间件之间传递的request是同一个对象。

process_response

多个中间件中process_response 方法是按照MIDDLEWARE中 中间件注册顺序倒序执行的,即第一个中间件中process_request方法先执行,

它的process_response最后执行;最后一个中间件的process_request方法最后执行,但是它的process_response方法最先开始执行。

(直白的理解请求来的时候process_request方法按照注册顺序从头开始执行,响应走的时候process_response方法按照注册表顺序从后向前依次执行)

注意:

定义process_response方法时,必须要传入两个形参  request 和  response。其中request就是传入的对象,response参数是视图函数返回的Httpresponse对象

(由这句话可以知道,process_response方法必须要等到视图层函数执行完,也就是Django后台逻辑处理完成之后),该方法必须要有返回值,也就是Httpresponse对象(return response)。

如果不返回  response  的话,浏览器收不到django后台返回的视图,而是中间件返回的视图。

processs_view

'''
process_view(self, request, view_func, view_args, view_kwargs)

该方法有四个参数

request是HttpRequest对象。

view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)

view_args是将传递给视图的位置参数的列表.

view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。

Django会在调用视图函数之前调用process_view方法。

它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,那么将不会执行Django的视图函数,而是直接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器
'''

注意:

process_view方法是在Django路由系统(urls.py)之后,视图系统之前(views.py)之前执行的,按照MIDDLEWARE中间件的注册顺序从前向后一次执行!

process_exception

'''
process_exception(self, request, exception)

该方法两个参数:

一个HttpRequest对象

一个exception是视图函数异常产生的Exception对象。

这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
'''

注意:

processs_exception方法只有在视图函数出现异常的时候才会触发,如果没有异常该方法不会执行。

process_template_response

'''
process_template_response(self, request, response)

它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。

process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。
'''

跨站请求伪造

1、简介

跨站请求伪造(csrf)      钓鱼网站
    就类似于你搭建了一个跟银行一模一样的web页面
    用户在你的网站转账的时候输入用户名 密码 对方账户
    银行里面的钱确实少了 但是发现收款人变了

2、原理

 最简单的原理
        你写的form表单中 用户的用户名  密码都会真实的提交给银行后台
        但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框
        你自己提前写好了一个隐藏的带有name和value的input框

3、解决策略

解决钓鱼网站的策略
    只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串
    当用户提交post请求的时候  我会自动先取查找是否有该随机字符串 
    如果有 正常提交
    如果没有  直接报403 

案例:模拟钓鱼网站

启动两个不同的Django项目,分别配置相应的views.py 中 transfer函数。。。。。。具体操作可参考视频作业!!!

 

如何解决提价POST请求Crsf中间件会报错的问题?

 form表单
        你在写的时候只需要加上一个
        {% csrf_token %}
ajax
        第一种  自己再页面上先通过{% csrf_token %}获取到随机字符串  然后利用标签查找 
        data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
        第二种
        data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
        第三种
        拷贝js文件

装饰器

装饰器
    csrf_exempt  只有两种装饰的方式
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    from django.utils.decorators import method_decorator
    # 第一种
    # @method_decorator(csrf_exempt,name='dispatch')
    class MyCsrf(View):
        # 第二种
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request,*args,**kwargs)
        def get(self,request):
            return HttpResponse('hahaha')
            
    除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式
    @method_decorator(csrf_protect,name='post')
    class MyCsrf(View):
        @method_decorator(csrf_protect)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request,*args,**kwargs)
        def get(self,request):
            return HttpResponse('hahaha')

        @method_decorator(csrf_protect)
        def post(self,request):
            return HttpResponse('post')
原文地址:https://www.cnblogs.com/qinsungui921112/p/11767809.html