zoukankan      html  css  js  c++  java
  • 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()

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

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

        

          

        

  • 相关阅读:
    element input搜索框探索
    Github网站css加载不出来的处理方法(转,亲测有效)
    通过用axios发送请求,全局拦截请求,获取到错误弄明白promise对象
    vuex和localStorage/sessionStorage 区别
    leetcode刷题笔记十一 盛最多水的容器 Scala版本
    leetcode刷题笔记十 正则表达式 Scala版本
    leetcode刷题笔记九 回文数 Scala版本
    leetcode刷题笔记八 字符串转整性 Scala版本
    leetcode刷题笔记七 整数反转 Scala版本
    leetcode刷题笔记六 Z字型转换 Scala版本
  • 原文地址:https://www.cnblogs.com/cbslock/p/12157628.html
Copyright © 2011-2022 走看看