视频学习网站防作弊方法
为了防止用户多点登录,同时开多个视频课程,对课程进度进行作弊,需要在每次登录时验证是否存在其他登录的session,并将使用其他session观看的课程视频记录停掉。
从网上找到两种思路:
1、查session表中存的userid,由于userid是编码后存储在session表的data字段中,因此每次调用userid都需要解码和遍历整个数据集
https://blog.csdn.net/weixin_34126215/article/details/88007060
2、将每个用户上次登录的sessionid存储在user扩展表中,这样就能快速查找用户对应的session。
https://blog.csdn.net/weixin_44834666/article/details/106017407
建议使用第二种思路,但我的实现方法有些区别。
参考手册:
读取除本次请求外的session的方法:
https://docs.djangoproject.com/zh-hans/3.1/topics/http/sessions/#using-sessions-out-of-views
扩展预定义User模型的方法:
一对一关联:
https://docs.djangoproject.com/zh-hans/3.1/topics/db/examples/one_to_one/
关于python装饰器:https://www.runoob.com/w3cnote/python-func-decorators.html
带参数的装饰器
装饰器还有更大的灵活性,例如带参数的装饰器,在上面的装饰器调用中,该装饰器接收唯一的参数就是执行业务的函数 foo 。装饰器的语法允许我们在调用时,提供其它参数,比如@decorator(a)。这样,就为装饰器的编写和使用提供了更大的灵活性。比如,我们可以在装饰器中指定日志的等级,因为不同业务函数可能需要的日志级别是不一样的。
def use_logging(level): def decorator(func): def wrapper(*args, **kwargs): if level == "warn": logging.warn("%s is running" % func.__name__) elif level == "info": logging.info("%s is running" % func.__name__) return func(*args) return wrapper return decorator @use_logging(level="warn") def foo(name='foo'): print("i am %s" % name) foo()
上面的 use_logging 是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器。我们可以将它理解为一个含有参数的闭包。当我 们使用@use_logging(level="warn")调用的时候,Python 能够发现这一层的封装,并把参数传递到装饰器的环境中。
@use_logging(level="warn") 等价于 @decorator
本文地址:https://blog.csdn.net/qq_27361945/article/details/110917180
上一篇: py
下一篇: 爬取网页文本数据--Python
推荐阅读