Django实现单用户登录的方法示例
作者:如何好听 发布时间:2021-12-21 03:26:41
最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了。今天由于工作需求,需要用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的单用户登录了。
核心代码截图:
具体实现代码如下:
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
来源:http://www.cnblogs.com/zzqit/p/10610570.html


猜你喜欢
- 本文实例讲述了Python实现识别图片内容的方法。分享给大家供大家参考,具体如下:python识别图片内容。这里我的环境为windows64
- 本文实例为大家分享了Python3实现汉语转换为汉语拼音的具体代码,供大家参考,具体内容如下工具: Python3.6.2,pycharm1
- 观看本文前最好有一定的Linux命令基础,具体为centos7.3环境中清除使用yum安装的Mysql卸载前请先关闭Mysql服务servi
- 前言为什么要引用单元测试类传统方法的缺点分析不方便,我们需要在main函数中去调用,这样就需要去修改main函数,如果现在项目正在运行,就可
- 简介工作中偶尔会出现一个查询数据的需求,那就是需要按天统计近一个月或其它一段时间内每天的所有记录或者分组数据,没有数据则自动补0。一般情况下
- 前言和Word、Excel承载数据的能力相比,PPT的应用重点在于表演。比如一场发布会、一场演说、一次产品展示、一次客户沟通&hel
- 两段使用键盘的上下键进行选择的代码:<Script Language="JScript"> &
- 用于模式匹配的String方法:String支持4种使用正则表达式的方法:seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的
- mysql8.0.12安装教程,分享给大家。一.安装1.从网上下载MySQL8.0.12版本,下载地址2. 下载完成后解压我解压的路径是:D
- 一.问题:太久没用mysql ,忘记了原先的root密码二:解决1.关闭mysql服务2.使用cd指令切换到mysql的bin目录使用mys
- 在将数据库从MSSQL迁移到MySQL的过程中,基于业务逻辑的要求,需要在MySQL的自增列插入0值。在MSSQL中是这样完成的: stri
- 数据库在时回加for xml auto调用方法 SqlCommand SqlComm=
- 摘要:本篇博客将详细介绍如何使用YOLOv5进行车牌识别模型的训练与评估。我们将搭建训练环境、准备数据、配置模型参数、启动训练过程,以及使用
- 开发中经常会遇得到需要多种条件组合查询的情况,比如有三个表,年级表Grade(GradeId,GradeName),班级Class(Clas
- 无法打开用户默认数据库,登录失败,其原因是登录帐户的默认数据库被删除。 解决办
- 地址:https://youzan.github.io/vant/#/zh-CN/intro一.引入Vant组件库1.首先运行 npm in
- 一、获取DataFrame列标签import pandas as pd file_path = '/Users/Arithmetic
- 不过先前的 调用方法着实有些繁琐,先实例化->添加参数、变量->写入,搞的跟把大象装冰箱里头一样麻烦。好在作者终于注意到这一点,
- 背景有一个项目,今年12月份开始重构,项目涉及到了socket。但是socket用的是以前一个开发人员封装的包(这个一直被当前的成员吐槽为什
- 本文实例讲述了javascript二维数组转置的方法。分享给大家供大家参考。具体实现方法如下:<script language=&qu