Django实现单用户登录的方法示例


Posted in Python onMarch 28, 2019

最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了。今天由于工作需求,需要用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的单用户登录了。

核心代码截图:

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/')

当然还有一些其他的实现方法,根据自己需求场景选择吧。其他的解决方法

https://stackoverflow.com/questions/8927327/allowing-only-single-active-session-per-user-in%20-django-APP

https://stackoverflow.com/questions/953879/how-to-force-user-logout-in-django

https://stackoverflow.com/questions/821870/how-can-i-detect-multiple-logins-into-a-django-web-application-from-different-lo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python分析git log日志示例
Feb 27 Python
python使用cPickle模块序列化实例
Sep 25 Python
Python的类实例属性访问规则探讨
Jan 30 Python
python通过装饰器检查函数参数数据类型的方法
Mar 13 Python
使用IPython来操作Docker容器的入门指引
Apr 08 Python
python实现按任意键继续执行程序
Dec 30 Python
python3调用R的示例代码
Feb 23 Python
python tornado微信开发入门代码
Aug 24 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
Python 如何提高元组的可读性
Aug 26 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 Python
pyqt5实现登录界面的模板
May 30 #Python
python实现AES加密和解密
Mar 27 #Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 #Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 #Python
Pandas读写CSV文件的方法示例
Mar 27 #Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 #Python
超简单使用Python换脸实例
Mar 27 #Python
You might like
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
php全排列递归算法代码
2012/10/09 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php实现的SESSION类
2014/12/02 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
jQuery 使用手册(三)
2009/09/23 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python实现方便使用的级联进度信息实例
2015/05/05 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
python实现Adapter模式实例代码
2018/02/09 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
Python如何读写二进制数组数据
2020/08/01 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
美国时尚在线:Showpo
2017/09/08 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
经销商年会策划方案
2014/05/29 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python