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的Supervisor进行进程监控以及自动启动
May 29 Python
Python根据区号生成手机号码的方法
Jul 08 Python
Python实现excel转sqlite的方法
Jul 17 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
Python any()函数的使用方法
Oct 28 Python
python循环输出三角形图案的例子
Nov 22 Python
Pytorch之contiguous的用法
Dec 31 Python
python 实现性别识别
Nov 21 Python
python openpyxl模块的使用详解
Feb 25 Python
使用python实现学生信息管理系统
Feb 25 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
Jquery性能优化详解
2014/05/15 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
Python语言实现将图片转化为html页面
2017/12/06 Python
Python实战之制作天气查询软件
2019/05/14 Python
python字典的遍历3种方法详解
2019/08/10 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
python实现简单的学生管理系统
2021/02/22 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
基于PyTorch中view的用法说明
2021/03/03 Python
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
2016教师校本培训心得体会
2016/01/08 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
详解CSS故障艺术
2021/05/25 HTML / CSS