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 02 Python
python测试mysql写入性能完整实例
Jan 18 Python
Python将多个list合并为1个list的方法
Jun 27 Python
浅谈python写入大量文件的问题
Nov 09 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
解决Mac下使用python的坑
Aug 13 Python
解决python 上传图片限制格式问题
Oct 30 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
Python装饰器用法与知识点小结
Mar 09 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
Jun 01 Python
python单元测试之pytest的使用
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
PHP session常见问题集锦及解决办法总结
2007/03/18 PHP
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
jQuery实现的导航下拉菜单效果
2016/07/04 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
jquery延迟对象解析
2016/10/26 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
最大K个数问题的Python版解法总结
2016/06/16 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Python读写docx文件的方法
2018/05/08 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS