最近由于要毕业了写论文做毕设, 然后还在实习发现已经好久都没有写博客了. 今天由于工作需求, 需要用 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/')
当然还有一些其他的实现方法, 根据自己需求场景选择吧. 其他的解决方法 http://stackoverflow.com/questions/8927327/allowing-only-single-active-session-per-user-in -django-App,http://stackoverflow.com/questions/953879/how-to-force-user -logout-in-django -Chewie,http://stackoverflow.com/questions/821870/how-can-i-detect-multiple-logins-into-a-django-web-application-from-different-lo 希望这些对你能够有帮助.
来源: https://www.cnblogs.com/zzqit/p/10610570.html