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益智游戏计算汉诺塔问题示例
Mar 05 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
May 25 Python
Python实现图片转字符画的示例代码
Aug 21 Python
python模块之paramiko实例代码
Jan 31 Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
Python grequests模块使用场景及代码实例
Aug 10 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
python如何在word中存储本地图片
Apr 07 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 01 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 购物车实例(申精)
2009/05/11 PHP
PHP处理会话函数大总结
2015/08/05 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
JavaScript 常用函数库详解
2009/10/21 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
初识Node.js
2015/03/20 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python常见内置高效率函数用法示例
2018/07/31 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
理工大学毕业生自荐信
2013/11/01 职场文书
房地产还款计划书
2014/01/10 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
说明书范文
2014/05/07 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
python实现剪贴板的操作
2021/07/01 Python