Django不允许单用户多浏览器同时登录

#在扩展用户表内,多添加一个session字段,用于存放session_key

models.py

class UserInfo(AbstractUser):
    id = models.AutoField(primary_key=True)
    department = models.CharField(max_length=10)
    last_login = models.CharField(max_length=32, null=True)
    login_ip = models.CharField(max_length=32, null=True)
    date_joined = models.CharField(max_length=32, null=True)
    session = models.CharField(max_length=32,null=True)

   views.py

def login(request):
    if request.method == "POST":
        
        #接收POST数据
        UserName = request.POST.get("UserName")
        Password = request.POST.get("Password")
        #获取登录电脑的IP
        ip = request.META[‘REMOTE_ADDR‘]
        
        if len(UserName) == 0 or len(Password) == 0:
            error_login = "用户名密码不能为空"
            return render(request, "login.html", locals())
            
        else:
            user = auth.authenticate(username=UserName, password=Password)
            
            # user如果为真,则验证通过
            if user:
            
                    #获取用户表里的session数据,
                pduser = UserInfo.objects.filter(username=UserName).values()[0]["session"]
                
                #如果session为“None”则说明还没有登录过的新用户
                
                if pduser == "None":
                    # 写入session
                    auth.login(request, user)
                    # username写入session
                    request.session["user"] = UserName
                    request.session["id"] = request.user.id
                    request.session["css_ys"] = request.user.css_ys
                    session_id = request.session.session_key
                    ip = request.META[‘REMOTE_ADDR‘]
                    ####登录后,会生成session_key,将session_key写入到用户表的session里面
                    UserInfo.objects.filter(username=UserName).update(session=session_id,login_ip=ip)
                    return redirect("/index/")
                #如果用户的session字段不为"None",则通过用户表session字段删除对应session表的session_key
                else:
                    #保证一个用户只存在一个session
                    
                    request.session.delete(pduser)
                    # 写入session
                    auth.login(request, user)
                    # username写入session
                    request.session["user"] = UserName
                    request.session["id"] = request.user.id
                    request.session["css_ys"] = request.user.css_ys
                    session_id = request.session.session_key
                    UserInfo.objects.filter(username=UserName).update(session=session_id)
                    # 获取登录IP
                    ip = request.META[‘REMOTE_ADDR‘]
                    UserInfo.objects.filter(username=UserName).update(login_ip=ip)
                    time_xxx = time.strftime("%Y-%m-%d %X")
                    Login_log.objects.create(user=UserName, IP=ip, login_time=time_xxx, status="登录成功")
                    return redirect("/index/")

            else:
                error_login = "用户名密码错误"
                request.session["id"] = request.user.id
                time_xxx = time.strftime("%Y-%m-%d %X")
                Login_log.objects.create(user=UserName, IP=ip, login_time=time_xxx, status="密码错误")
                return render(request, "login.html", locals())
    
    else:
        ip = request.META[‘REMOTE_ADDR‘]
        return render(request, "login.html", locals())

  

猜你喜欢

转载自www.cnblogs.com/linwenbin/p/11647693.html