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()

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

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

    

      

 

    

posted @ 2020-01-06 17:54  John.Liu-  阅读(362)  评论(0编辑  收藏  举报