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()
可以说装饰器就是闭包函数的外层函数。
装饰器和全局组件可以说是一对互补的关系。如果某一些函数需要增加一些逻辑。则可以使用装饰器。如果大部分函数都需要增加一些逻辑,则可以使用全局组件。