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 相关文章推荐
Zabbix实现微信报警功能
Oct 09 Python
关于Python中异常(Exception)的汇总
Jan 18 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
Python装饰器用法实例分析
Jan 14 Python
python xpath获取页面注释的方法
Jan 14 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
python实现canny边缘检测
Sep 14 Python
PyCharm常用配置和常用插件(小结)
Feb 06 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php的ajax简单实例
2014/02/27 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
JavaScript实现全选取消效果
2017/12/14 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python3里的super()和__class__使用介绍
2015/04/23 Python
python通过smpt发送邮件的方法
2015/04/30 Python
Python中的推导式使用详解
2015/06/03 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
安全生产管理合理化建议书
2014/03/12 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
2014年营业员工作总结
2014/11/18 职场文书
Python中文纠错的简单实现
2021/07/07 Python