Django实现单用户登录的方法示例

yipeiwu_com6年前Python基础

最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了。今天由于工作需求,需要用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 -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中生成器和迭代器的区别详解

Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list、string、tuple、dict等这些容器对象,使用for循环...

详解django实现自定义manage命令的扩展

在Django开发过程中我们都用过django-admin.py和manage.py命令。 django-admin.py是一个命令行工具,可以执行一些管理任务,比如创建Django项目...

python实现dijkstra最短路由算法

python实现dijkstra最短路由算法

Dijkstra算法:又称迪杰斯特拉算法,迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图...

Python中map,reduce,filter和sorted函数的使用方法

map map(funcname, list) python的map 函数使得函数能直接以list的每个元素作为参数传递到funcname中, 并返回响应的新的list 如下:...

Python3 使用map()批量的转换数据类型,如str转float的实现

我们知道map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新...