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在Console下显示文本进度条的方法
Feb 14 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
Django框架自定义session处理操作示例
May 27 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
python输出数学符号实例
May 11 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
python绘图subplots函数使用模板的示例代码
Apr 30 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
PHP4之COOKIE支持详解
2006/10/09 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
百度留言本js 大家可以参考下
2009/10/13 Javascript
js自定义事件代码说明
2011/01/31 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
django批量导入xml数据
2016/10/16 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
django实现后台显示媒体文件
2020/04/07 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
青春无悔演讲稿
2014/05/08 职场文书
个人年底工作总结
2015/03/10 职场文书
股东协议书范本2016
2016/03/21 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
浅谈Redis的几个过期策略
2021/05/27 Redis
Python 数据可视化之Bokeh详解
2021/11/02 Python