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

摘要:
#在扩展用户表中,再添加一个会话字段以存储session_keymodels.pyclassUserInfo(AbstractUser):id=models.AutoField(primary_key=True)department=models。CharField(max_length=10)last_login=模型。CharField(max_longth=32,nul

#在扩展用户表内,多添加一个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())

免责声明:文章转载自《Django不允许单用户多浏览器同时登录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前馈神经网络介绍嵌入式软件机器编程为啥选择梯形图作为编程语言?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django命名空间app_name和namespace

前言: django命名空间解决什么问题? 在多个app之间,有可能产生同名的url,这个时候避免反转url的时候混淆,可以使用应用命名空间做区分。应用命名空间使用。在应用url中定义 app_name; 一个app,可以创建多个url映射到一个app中,所以就会产生一个问题,在做反转的时候,如果不使用命名空间,就会混淆,为了避免这个问题。我们可以使用实...

.Net基础:ASP.NET中的session存储模式运用

在asp.net中的Session存储方式不象asp那样单一,一共提供了三种存储方式,由于最近一个2000多人使用的web软件出现了故障, 用户每天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了.整天都不会出现同样的问题 ,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大...

Django——中间件

中间件定义: 中间件是一个、一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类。 看下面的代码在settings里中间件的类: MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddlewa...

Django添加favicon.ico图标

Django添加favicon.ico图标 第一步:制作ico图标 制作 favicon.ico 图标的网址:www.bitbug.net  很简单,不难  做完之后,将生成ico图标,命名为:favicon.ico 第二步:将生成的图表存放至 静态文件夹  static/images/ 下 第三步:在HTML文件 里面引入静态文件 在 <he...

linux ------ 使用 screen 后 SSH 断开后程序依旧能在后台运行

为什么ssh断开后你运行的进程会退出呢? 因为所有进程都得有个父进程。当你ssh到一个服务器上时,打开的shell就是你所有执行命令的父进程。 当你断开ssh连接时,你的命令的父进程就没了。如果处理不当,这些进程就会收到SIGTERM信号,全被干掉了。 然后说解决方案: 让你运行的进程的父进程变成PID=1的init进程,这样你的shell退出后不影响这...

django 国际化

参考文档: https://docs.djangoproject.com/zh-hans/2.2/topics/i18n/translation/ https://blog.csdn.net/qq_36963372/article/details/88788463 https://www.jianshu.com/p/b7fd0658989d 配置 se...