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中操作字符串之replace()方法的使用
May 19 Python
Python读取Excel的方法实例分析
Jul 11 Python
详解Python字符串对象的实现
Dec 24 Python
python连接数据库的方法
Oct 19 Python
python导出hive数据表的schema实例代码
Jan 22 Python
基于python3实现socket文件传输和校验
Jul 28 Python
Python3 log10()函数简单用法
Feb 19 Python
python3实现绘制二维点图
Dec 04 Python
Python hmac模块使用实例解析
Dec 24 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python 管理系统实现mysql交互的示例代码
Dec 06 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/04 星际争霸
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
关于laravel 子查询 & join的使用
2019/10/16 PHP
用于table内容排序
2006/07/21 Javascript
用脚本调用样式的几种方法
2006/12/09 Javascript
javascript延时加载之defer测试
2012/12/28 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
vue实现图片上传功能
2020/05/28 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
详解python多线程之间的同步(一)
2019/04/03 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
小学教师自我鉴定范文
2014/03/20 职场文书
体育之星事迹材料
2014/05/11 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python
vue3获取当前路由地址
2022/02/18 Vue.js
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS