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获取单个程序CPU使用情况趋势图
Mar 10 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python使用googletrans报错的解决方法
Sep 25 Python
Python 进程之间共享数据(全局变量)的方法
Jul 16 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
django框架中间件原理与用法详解
Dec 10 Python
Python模拟登录requests.Session应用详解
Nov 17 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
python自动生成sql语句的脚本
Feb 24 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
python 自动刷新网页的两种方法
Apr 20 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实现双链表删除与插入节点的方法示例
2017/11/11 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
Vuex提升学习篇
2018/01/11 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
详解微信UnionID作用
2019/05/15 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
python中元类用法实例
2014/10/10 Python
Python中特殊函数集锦
2015/07/27 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
广州盈通面试题
2015/12/05 面试题
护理学专业推荐信
2013/12/03 职场文书
编辑找工作求职信范文
2013/12/16 职场文书
小学生优秀评语大全
2014/04/22 职场文书
授权委托书范文
2014/07/31 职场文书
工作失职检讨书500字
2014/10/17 职场文书
工作能力自我评价2015
2015/03/05 职场文书
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS