• 5、django全局组件和装饰器


    全局组件:

      1、全局组件就是Django默认的settings里面MIDDLEWARE的数据。

        所有的请求在路由分发之前必须都把所有的组件文件执行一遍,如果不报错,才进行下去。

        对于绝大多数接口都需要进行的操作。我们就可以放在组件里面。比如对于cookies、session、token的校验

        。代码如下:

    class SessionCheck(MiddlewareMixin):
        """
        做session校验,除login接口。
        其余接口没有session的一律重定向到login
        """
        def process_request(self, request):
            if request.path in ["/login/"] or ["/reg/"]:
                return None
            else:
                slogin = request.session.get("login")
                if not slogin:
                    return redirect("/login/")
                elif request.path in ["/error/"]:
                    return None
                else:
                    return None
    
        def process_response(self, request, response):
            return response
    
    
    class AccessFrequencyVerification2(MiddlewareMixin):
        """
        做访问频率校验。
        1、每次登录。在表里面查询有无该ip的访问记录。
        2、如果没有。记录ip、访问时间。 访问次数写成1
        3、如果表里面查询有该IP的访问记录。且访问时间距当前时间小于60s,则访问次数+1。大于则不变。
        4、访问之前判断次数有没有大于20。如果大于,请求接到一个独立页面。
        """
        def process_request(self, request):
            if request.path in ["/error/"]:
                return None
            else:
                if request.META.get('HTTP_X_FORWARDED_FOR'):
                    ip = request.META.get("HTTP_X_FORWARDED_FOR")
                else:
                    ip = request.META.get("REMOTE_ADDR")
    
                a = AccessFrequencyVerification.objects.filter(ip=ip).first()
                if a is None:
                    # 新用户插入数据逻辑
                    time = timezone.now()
                    AccessFrequencyVerification.objects.create(
                        ip=ip,
                        Access_time=time,
                        Number_visits=1,
                    )
                else:
                    # 老用户处理逻辑
                    Access_time = AccessFrequencyVerification.objects.filter(ip=ip).first().Access_time
                    time = timezone.now()
                    time_difference = time-Access_time
                    a = AccessFrequencyVerification.objects.filter(ip=ip).first().Number_visits
                    b = datetime.timedelta(seconds=60)
                    if time_difference < b:
                        # 60s之内连续登录
                        AccessFrequencyVerification.objects.filter(ip=ip).update(Number_visits=a+1)
                    else:
                        # 60s之后登录
                        AccessFrequencyVerification.objects.filter(ip=ip).update(Access_time=time)
                        AccessFrequencyVerification.objects.filter(ip=ip).update(Number_visits=0)
                    if a > 20:
                        return redirect("/error/")
                    else:
                        return None

          一个是session校验,一个是ip访问频率校验。写完之后把路由写到MIDDLEWARE里面即可生效

    装饰器

      1、学装饰器之前首先要了解闭包。闭包函数:内层函数应用了外层函数的环境变量。基本格式如下:

    def add():
        a = 1
    
        def inner():
            print(a)
        return inner
    
    
    a = add()
    print(a.__closure__)

        打印结果为。

         如果不是闭包,则打印为None。

      

      2、装饰器:

        下面是一个装饰器的最简单的例子。

    def login(func):
    
        def inner():
            print("aaaaaaaaaa")
            func()
        return inner
    
    
    @login
    def index():
        print("hello")
    
    
    index()

        可以说装饰器就是闭包函数的外层函数。

        装饰器和全局组件可以说是一对互补的关系。如果某一些函数需要增加一些逻辑。则可以使用装饰器。如果大部分函数都需要增加一些逻辑,则可以使用全局组件。

        

          

        

  • 相关阅读:
    使用Java和JS访问cookies
    详细介绍Java内存泄露原因
    Java与Unicode
    电子商务那点事
    request的一些常用方法
    一些java当中的名词解释
    rpc远程服务
    war包和jar包的区别
    为什么内存贵硬盘便宜
    分层开发的优势
  • 原文地址:https://www.cnblogs.com/cbslock/p/12157628.html
Copyright © 2020-2023  润新知