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

 

 

本文地址:https://blog.csdn.net/qq_27361945/article/details/110917180