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 相关文章推荐
初步剖析C语言编程中的结构体
Jan 16 Python
Python中matplotlib中文乱码解决办法
May 12 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 Python
Python引用传值概念与用法实例小结
Oct 07 Python
Python求出0~100以内的所有素数
Jan 23 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
Oct 21 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
Python实现常见的回文字符串算法
Nov 14 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
利用python做数据拟合详情
Nov 17 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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
ajax实现无刷新分页(php)
2010/07/18 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
Django websocket原理及功能实现代码
2020/11/14 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
毕业求职自荐信格式是什么
2013/11/19 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
校园演讲稿汇总
2014/05/21 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
国庆节活动总结
2014/08/26 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
SpringBoot生成License的实现示例
2021/06/16 Java/Android