Django实现单用户登录

最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了。今天由于工作需求,需要用Django实现单用户登录。大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数。由于用的是Django自带的认证,然后校验用户是否登录其实就是通过Session实现的。下面就简单分享一下怎么实现的吧。

单用户登录实现

在做用户登录认证的时候Django自带的有is_authenticated()方法。下面就是一个简单的认证过程。

if request.user.is_authenticated():  # 判断是否登录
    return redirect(‘/index/‘)
else:
    return redirect(‘/accounts/login/‘)

现在步入正题,讲一下具体实现流程吧。我们在做用户登录的时候一般会扩展Django自带的User表,当然方法一般有几种,你可以继承AbstractUser表然后写入自己想要的字段,还可以单独建个表然后跟User表建立一对一的关系,具体的实现这里就不多加描述了。

我才用的是单独建立一个用户信息表于User表进行一对一关联,在用户表里面增加一个session_key字段用于存最新用户登录的session_key。每次我们登录就取出这个值进行判断,如果里面没有值,表示用户没有登录就可以走正常的登录流程。如果里面有值,说明代表的是前面用户登录留下的session_key,我们就先在Session表里面删除掉这个记录,让上一个登录用户的Session失效,然后登录的时候再把最新登录生成的session_key更新到用户信息表里面,用作下一个校验。这样就能简单快捷的实现Django的单用户登录了。

核心代码截图:

具体实现代码如下:

from django.shortcuts import redirect
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import login as auth_login, authenticate
from app01.models import UCenter  # 用户信息表

@csrf_exempt
@never_cache
def login(request):
    if request.user.is_authenticated():
        return redirect(‘/index/‘)
    else:
        if request.method == "POST":
            username = request.POST.get("username")
            password = request.POST.get("password")
            authenticated_user = authenticate(username=username, password=password)
            if authenticated_user:

                # 单用户登录
                user_obj = UCenter.objects.filter(userid=authenticated_user)  # 找到登录的user对象
                is_session_key = user_obj.first().session_key  # 获取登录对象的session_key
                if is_session_key:  # 用户已登录
                    request.session.delete(is_session_key)  # 删除登录前面登录用户的session_key
                auth_login(request, authenticated_user)  # 用户信息存入session
                user_obj.update(session_key=request.session.session_key)  # 更新新登录user的session_key
                return redirect(‘/index/‘)
            else:
                return redirect(‘/accounts/login/‘)

当然还有一些其他的实现方法,根据自己需求场景选择吧。其他的解决方法http://stackoverflow.com/questions/8927327/allowing-only-single-active-session-per-user-in -django-APPhttp://stackoverflow.com/questions/953879/how-to-force-user -logout-in-django –Chewiehttp://stackoverflow.com/questions/821870/how-can-i-detect-multiple-logins-into-a-django-web-application-from-different-lo希望这些对你能够有帮助。

原文地址:https://www.cnblogs.com/zzqit/p/10610570.html

时间: 2024-08-02 05:25:32

Django实现单用户登录的相关文章

Django学习之用户登录

前面说了,用户注册,今天我们就来说说用户登录吧.今天说的是使用Django的session功能,而不是它的auth模块,后期,如果有机会的话,我再写点auth认证登录. 其实重点就是request.session功能,默认Django就将其session功能打开了,我们仅仅需要的是配置下数据库. website/settings.py DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',       

关于单用户登录

闲的蛋疼,自己弄了个单用户登录,第二次登录可以把第一次登录的用户挤下去... 先上login的代码: //...登录验证成功后... //这里获得uuid String uuid = super.getUUID(); //保存登录用户的数据 LoginUser login = new LoginUser(); login.setId(user.getId()); login.setAccount(user.getAccount()); login.setRealName(user.getReal

ASP.NET MVC实现一个用户只能登录一次 单用户登录

现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html 实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧

Asp.NET WebApi+Redis实现单用户登录实战演练

一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和完善此系列课程! 1.1.本高级系列课程适合人群如下: 1.有一定的NET开发基础并对ASP.NET WebApi.Redis.技术有一定了解和认识. 2.喜欢阿笨的干货分享课程的童鞋们. 1.2.一句话总结今天我们要解决的问题? 我们如何实现系统限制一个账号同一时刻只能一个用户账号登录使用(不能同时登录),

SpringSecurity 3.2入门(3)单用户登录

增加spring-security.xml文件配置如下 <!-- 配置SpringSecurity的http安全服务 --> <security:http auto-config="true"> <!-- 单用户登陆 --> <!-- 仅配置max-sessions="1",则第二次登录会让第一次登录失效. --> <!-- 同时配置max-sessions="1" error-if-maxi

shiro 实现单用户登录,一个用户同一时刻只能在一个地方登录

我这里 shiro 并没有集成 springMVC,直接使用 ini 配置文件. shiro.ini [main] # Objects and their properties are defined here, # Such as the securityManager, Realms and anything # else needed to build the SecurityManager authc.loginUrl = /login.jsp authc.successUrl = /w

centos 单用户登录

1.按e 编辑 2.修改启动配置,增加 init=/bin/sh 后按ctrl+x键 进入单用户模式 Ctrl+x 执行进入单用户 修改完毕后可以 执行 exec  /sbin/init 进入多用户模式 单用户模式下,很多命令需要添加绝对路径才能执行. 例如: /sbin/fdisk 单用编辑不了 fatab文件可以使用 mount -o remount,rw / 原文地址:https://www.cnblogs.com/caonw/p/11669846.html

Django实战(一)-----用户登录与注册系统4(表单)

我们前面都是手工在HTML文件中编写表单form元素,然后在views.py的视图函数中接收表单中的用户数据,再编写验证代码进行验证,最后使用ORM进行数据库的增删改查.这样费时费力,整个过程比较复杂,而且有可能写得不太恰当,数据验证也比较麻烦. 设想一下,如果我们的表单拥有几十上百个数据字段,有不同的数据特点,如果也使用手工的方式,其效率和正确性都将无法得到保障. 有鉴于此,Django在内部集成了一个表单功能,以面向对象的方式,直接使用Python代码生成HTML表单代码,专门帮助我们快速处

django框架学习:二十四.django表单post登录案例

前言 上一篇学习了注册案例,今天学习一下post登录案例,注册是往数据库插入数据,登 录是从数据库里面查询数据. 注册页面 新建HTML文件,表单提交页面包含name,age,qq,psw,提交. 页面显示如下: 注册页面视图函数 通过表单提交的请求数据,先去数据库进行查询,如果有返回用户名已经存在,如果没有此用户名在数据库创建保存提交的数据,密码psw为了安全需要进行加密处理. 密码加密make_password from django.contrib.auth.hashers import