Django——限制用户不能同时在多个浏览器进行登录
·
1、在对应的user表中添加一个字段(sid)用来存放sessionid,建议用缓存的方式存放,这里因为没有配置redis数据库所以直接用mysql
2、用户登录视图类
# 比较懒,所以就全部复制进来了,没有挑出来
class LoginView(View):
def get(self, request):
msg = ''
try:
msg = request.COOKIES['msg'].encode('latin-1').decode('utf-8')
except Exception as e:
pass
res = render(request, 'login.html', {'msg': msg})
return res
def post(self, request):
# 获取数据
username = request.POST.get('username')
password = request.POST.get('password')
# 获取验证码
code = request.POST.get('code')
# 数据校验
if not all([username, password, code]):
return render(request, 'login.html', {'msg':'数据不完整'})
# 校验验证码
code_session = request.session['verifycode']
# if code_session.upper() == code.upper():
# pass
# else:
# return render(request, 'login.html', {'msg': '验证码错误'})
# 登录验证
# 如果不匹配就返回空,匹配就返回user对象
user = authenticate(username=username, password=password) # 验证账号密码是否匹配
if user is not None:
# 判断用户是否激活
if not user.is_active:
return render(request, 'login.html', {'msg':'未激活'})
else:
# 记住用户登录状态,django中封装好的一个类,存放user的session
login(request, user)
request.COOKIES['msg'] = ''
user.sid = request.session.session_key
user.save()
print(user.sid)
return redirect(reverse('study:index'))
else:
return render(request, 'login.html', {'msg': '输入正确的用户名和密码'})
- 创建一个类装饰器,用来检查sessionid是否发生改变,如果发生变化表明在其他地方登录了
class Relogin():
def __init__(self, func):
self.func = func
def __call__(self, request, *args, **kwargs):
# 判断是否在另一个浏览器登录了
user = request.user
username = user.username
print(request.COOKIES['sessionid'])
try:
print('1')
if request.COOKIES['sessionid'] != user.sid:
print('用户已经在其他地方登录')
res = redirect(reverse('user:login'))
res.set_cookie('msg', '用户已经在其他地方登录'.encode('utf-8').decode('latin-1'))
return res
except Exception as e:
pass
return self.func(self, request)
3、对应的视图类
class StudyView(LoginRequired, View, Relogin):
@Relogin
def get(self,request):
# super().check(request)
# re = Relogin()
# re.check(request)
# 判断是否在另一个浏览器登录了
# user = request.user
# username = user.username
# print(request.COOKIES['sessionid'])
# try:
# print('1')
# if request.COOKIES['sessionid'] != user.sid:
# print('用户已经在其他地方登录')
# res = redirect(reverse('user:login'))
# res.set_cookie('msg','用户已经在其他地方登录'.encode('utf-8').decode('latin-1'))
# return res
# except Exception as e:
# pass
return render(request, 'index.html')
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)