1、在对应的user表中添加一个字段(sid)用来存放sessionid,建议用缓存的方式存放,这里因为没有配置redis数据库所以直接用mysql
2、用户登录视图类

# 比较懒,所以就全部复制进来了,没有挑出来
class LoginView(View):
    def get(self, request):
        msg = ''
        try:
            msg = request.COOKIES['msg'].encode('latin-1').decode('utf-8')
        except Exception as e:
            pass

        res = render(request, 'login.html', {'msg': msg})
        return res
    def post(self, request):

        # 获取数据
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 获取验证码
        code = request.POST.get('code')
        # 数据校验
        if not all([username, password, code]):
            return render(request, 'login.html', {'msg':'数据不完整'})
        # 校验验证码
        code_session = request.session['verifycode']
        # if code_session.upper() == code.upper():
        #     pass
        # else:
        #     return render(request, 'login.html', {'msg': '验证码错误'})
        # 登录验证
        # 如果不匹配就返回空,匹配就返回user对象
        user = authenticate(username=username, password=password) # 验证账号密码是否匹配
        if user is not None:
            # 判断用户是否激活
            if not user.is_active:
                return render(request, 'login.html', {'msg':'未激活'})
            else:
                # 记住用户登录状态,django中封装好的一个类,存放user的session
                login(request, user)
                request.COOKIES['msg'] = ''
                user.sid = request.session.session_key
                user.save()
                print(user.sid)
                return redirect(reverse('study:index'))
        else:
            return render(request, 'login.html', {'msg': '输入正确的用户名和密码'})
  1. 创建一个类装饰器,用来检查sessionid是否发生改变,如果发生变化表明在其他地方登录了
class Relogin():
    def __init__(self, func):
        self.func = func

    def __call__(self, request, *args, **kwargs):
        # 判断是否在另一个浏览器登录了
        user = request.user
        username = user.username
        print(request.COOKIES['sessionid'])
        try:
            print('1')
            if request.COOKIES['sessionid'] != user.sid:
                print('用户已经在其他地方登录')

                res = redirect(reverse('user:login'))
                res.set_cookie('msg', '用户已经在其他地方登录'.encode('utf-8').decode('latin-1'))
                return res
        except Exception as e:
            pass
        return self.func(self, request)

3、对应的视图类

class StudyView(LoginRequired, View, Relogin):

    @Relogin
    def get(self,request):
        # super().check(request)
        # re = Relogin()
        # re.check(request)
        # 判断是否在另一个浏览器登录了
        # user = request.user
        # username = user.username
        # print(request.COOKIES['sessionid'])
        # try:
        #     print('1')
        #     if request.COOKIES['sessionid'] != user.sid:
        #         print('用户已经在其他地方登录')
        #         res = redirect(reverse('user:login'))
        #         res.set_cookie('msg','用户已经在其他地方登录'.encode('utf-8').decode('latin-1'))
        #         return res
        # except Exception as e:
        #     pass
        return render(request, 'index.html')
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐