需求
开发web产品时,页面上有些功能需要限制用户操作的频率,避免工具等恶意攻击。
网页前端能够限制用户的操作,后台同样需要限制操作(防范绕过前端限制)
例如,开发开测平台——真机租用服务时,限制用户截图的操作频率,效果图:
实现
后台众多接口都有限制频率的需求,因此使用python的装饰器,方便扩展现有功能,修改成本低
用户操作功能频率一般大于0.3s,因此装饰器中默认间隔时间是0.3秒
装饰器:
"""
seconds单位是秒
需要捕获异常exceptions.FunctionFrequency
"""
def runFrequencyLimit(seconds=0.3):
def call_func(fn):
cache = {}
@wraps(fn)
def wrapper(*params, **paramMap):
if fn.__name__ in cache:
last_time = cache[fn.__name__]
if time.time() - last_time > seconds:
ret = fn(*params, **paramMap)
cache[fn.__name__] = time.time()
return ret
else:
raise exceptions.FunctionFrequency()
else:
ret = fn(*params, **paramMap)
cache[fn.__name__] = time.time()
return ret
return wrapper
return call_func
调用只需要添加该装饰器即可:
@runFrequencyLimit()
def handle_snapshot(self, *params, **paramMap):
try:
# 截图的操作,此处省略
except exceptions.FunctionFrequency:
print "操作过于频繁,请休息一下再试^_^"