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字符串处理函数简明总结
Apr 13 Python
简单谈谈python中的多进程
Nov 06 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
Python+request+unittest实现接口测试框架集成实例
Mar 16 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
分析经典Python开发工程师面试题
Apr 08 Python
在Python中实现函数重载的示例代码
Dec 12 Python
Python文件操作基础流程解析
Mar 19 Python
python实现对变位词的判断方法
Apr 05 Python
基于Python爬虫采集天气网实时信息
Jun 05 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
详解Django的CSRF认证实现
2018/10/09 Python
python opencv实现图像配准与比较
2021/02/09 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
实习教师自我鉴定
2013/09/27 职场文书
毕业生自荐书
2014/02/02 职场文书
报关专员求职信范文
2014/02/22 职场文书
村干部承诺书
2014/03/28 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
预备党员转正考核材料
2014/06/03 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
辞职书格式样本
2015/02/26 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
python装饰器代码解析
2022/03/23 Python
Java中的Kotlin 内部类原理
2022/06/16 Java/Android