视频学习网站防作弊方法

为了防止用户多点登录,同时开多个视频课程,对课程进度进行作弊,需要在每次登录时验证是否存在其他登录的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/auth/customizing/#extending-the-existing-user-model

一对一关联:

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

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值