一、登录

  1. from django.contrib.auth import login, authenticate, logout
  2. class LoginView(View):
  3. def post(self, request):
  4. # 1、提取参数
  5. data = json.loads(request.body.decode())
  6. username = data.get('username')
  7. password = data.get('password')
  8. remembered = data.get('remembered')
  9. # 2、校验参数
  10. if not all([username, password]):
  11. return JsonResponse({'code': 400, 'errmsg': '参数缺失!'})
  12. if not re.match(r'^\w{5,20}$', username):
  13. return JsonResponse({'code': 400, 'errmsg': '用户名格式有误'}, status=400)
  14. if not re.match(r'^\w{8,20}$', password):
  15. return JsonResponse({'code': 400, 'errmsg': '密码格式有误'}, status=400)
  16. # 3、数据处理(验证用户名和密码)
  17. # try:
  18. # user = User.objects.get(username=username)
  19. # except User.DoesNotExist as e:
  20. # return JsonResponse({'code': 400, 'errmsg': '用户名错误!'})
  21. # if not user.check_password(password):
  22. # return JsonResponse({'code': 400, 'errmsg': '密码错误!'})
  23. # authenticate():功能、参数、返回值
  24. # 功能:传统身份验证——验证用户名和密码
  25. # 参数:request请求对象,username用户名和password密码
  26. # 返回值:认证成功返回用户对象,否则返回None
  27. user = authenticate(request, username=username, password=password)
  28. if not user:
  29. return JsonResponse({"code": 400, 'errmsg': '您提供的身份信息无法验证!'}, status=401)
  30. # 状态保持
  31. login(request, user)
  32. if remembered:
  33. # 设置session有效期默认2周
  34. request.session.set_expiry(None)
  35. else:
  36. # 设置session有效期为关闭浏览器页面则失效
  37. request.session.set_expiry(0) # 设置为0表示关闭浏览器清楚sessionid
  38. # 4、构建响应
  39. response = JsonResponse({'code': 0, 'errmsg': 'ok'})
  40. response.set_cookie(
  41. 'username',
  42. username,
  43. max_age=3600 * 24 * 7
  44. )
  45. return response
  1. re_path(r'^login/$', LoginView.as_view()),
  1. """
  2. 自定义身份认证后端,来实现多账号登陆
  3. """
  4. from django.contrib.auth.backends import ModelBackend
  5. from .models import User
  6. class UsernameMobileAuthBackend(ModelBackend):
  7. # 重写authenticate实力方法,实现多账号登陆
  8. # 默认ModelBackend只会根据username过滤用户
  9. def authenticate(self, request, username=None, password=None, **kwargs):
  10. # request: 请求对象
  11. # username: 用户名或手机号
  12. # password: 密码
  13. # 1、根据用户名过滤
  14. try:
  15. user = User.objects.get(username=username)
  16. except User.DoesNotExist as e:
  17. # 2、根据手机号过滤
  18. try:
  19. user = User.objects.get(mobile=username)
  20. except User.DoesNotExist as e:
  21. return None
  22. # 3、其中某一个过滤出用户,再校验密码
  23. if user.check_password(password):
  24. return user
  1. # 自定义认证后端
  2. AUTHENTICATION_BACKENDS = [
  3. "users.utils.UsernameMobileAuthBackend"
  4. ]

二、退出

  1. class LogoutView(View):
  2. def delete(self, request):
  3. # 1、获取用户对象
  4. # request.user是当前登陆的用户 或 是一个匿名用户
  5. # user是用户模型类对象 或 AnonymousUser匿名用户对象
  6. # user = request.user
  7. # 2、调用logout函数清除用户session数据
  8. # 通过request对象提取cookie中是sessionid,进一步删除redis中的用户数据
  9. logout(request)
  10. # 3、构建响应
  11. response = JsonResponse({'code': 0, 'errmsg': 'ok'})
  12. response.delete_cookie('username')
  13. return response
  1. re_path(r'^logout/$', LogoutView.as_view()),

三、定义模型基类

  1. from django.db import models
  2. class BaseModel(models.Model):
  3. """为模型类补充字段"""
  4. create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
  5. update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
  6. class Meta:
  7. abstract = True # 说明是抽象模型类, 用于继承使用,数据库迁移时不会创建BaseModel的表