zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?
    17 | 如何正确地显示随机消息?
    16 | “order by”是怎么工作的?
    15 | 答疑文章(一):日志和索引相关问题
    14 | count(*)这么慢,我该怎么办?
    13 | 为什么表数据删掉一半,表文件大小不变?
    12 | 为什么我的MySQL会“抖”一下?
    11 | 怎么给字符串字段加索引?
    10 | MySQL为什么有时候会选错索引?
    2016 Multi-University Training Contest 4
  • 原文地址:https://www.cnblogs.com/qinsungui921112/p/11767809.html
Copyright © 2011-2022 走看看