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数组遍历的简单实现方法小结
Apr 27 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
Python操作csv文件实例详解
Jul 31 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
pytorch中的numel函数用法说明
May 13 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
实例讲解Python中sys.argv[]的用法
Jun 03 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 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
海贼王:最美的悬赏令!
2020/03/02 日漫
留言板翻页的实现详解
2006/10/09 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
validator验证控件使用代码
2010/11/23 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python中collections模块的基本使用教程
2018/12/07 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
python处理RSTP视频流过程解析
2020/01/11 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
捐资助学倡议书
2014/04/15 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
心得体会格式及范文
2016/01/25 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js
Java 多线程并发FutureTask
2022/06/28 Java/Android