• 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())
    

      

  • 相关阅读:
    深度学习开源框架大礼包
    python3实现多线程
    TNN MatConvertParam参数scale和bias设置
    pytorch加载预训练模型
    linux下遍历文件夹及获取路径下文件名字(字符串操作)
    已解决:在/var/spool/cron/root中执行shell脚本定时任务,ipvsadmsave n > x.save保存的文件为空
    http_build_query
    API接口返回数据结构构建类
    使用vscode+夜神模拟器遇到连接不上的解决方法
    build.gradle
  • 原文地址:https://www.cnblogs.com/linwenbin/p/11647693.html
Copyright © 2020-2023  润新知