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使用any判断一个对象是否为空的方法
Nov 19 Python
python解析xml文件实例分析
May 27 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
Python实现爬虫从网络上下载文档的实例代码
Jun 13 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
python palywright库基本使用
Jan 21 Python
python - timeit 时间模块
Apr 06 Python
Python 语言实现六大查找算法
Jun 30 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 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
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
php adodb介绍
2009/03/19 PHP
浅谈php自定义错误日志
2015/02/13 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
python用户评论标签匹配的解决方法
2018/05/31 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
Django密码系统实现过程详解
2019/07/19 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
销售文员岗位职责
2013/11/29 职场文书
求职毕业生自荐书
2014/02/08 职场文书
报关报检委托书
2014/04/08 职场文书
节约用水演讲稿
2014/05/21 职场文书
品酒会策划方案
2014/05/26 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
Elasticsearch 索引操作和增删改查
2022/04/19 Python
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技