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中给List添加元素的4种方法分享
Nov 28 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
python实现批量按比例缩放图片效果
Mar 30 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
python 字符串常用方法汇总详解
Sep 16 Python
如何获取Python简单for循环索引
Nov 21 Python
python简单的三元一次方程求解实例
Apr 02 Python
Python如何实现定时器功能
May 28 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 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
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JS简单计算器实例
2015/01/20 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
js实现简单分页导航栏效果
2019/06/28 Javascript
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
Python构建网页爬虫原理分析
2017/12/19 Python
Python笔记之工厂模式
2019/11/20 Python
Python reversed函数及使用方法解析
2020/03/17 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
中文教师求职信
2014/02/22 职场文书
信息工作经验交流材料
2014/05/28 职场文书
六查六看剖析材料
2014/10/06 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
个人培训总结
2015/03/05 职场文书
python urllib库的使用详解
2021/04/13 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python