login.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: user.py
  6. @date:2025/4/14 10:22
  7. @desc:
  8. """
  9. from django.core.cache import cache
  10. from django.utils.translation import gettext_lazy as _
  11. from drf_spectacular.utils import extend_schema
  12. from rest_framework.request import Request
  13. from rest_framework.views import APIView
  14. from common import result
  15. from common.auth import TokenAuth
  16. from common.constants.cache_version import Cache_Version
  17. from common.log.log import log
  18. from common.utils.common import encryption
  19. from models_provider.api.model import DefaultModelResponse
  20. from users.api.login import LoginAPI, CaptchaAPI
  21. from users.serializers.login import LoginSerializer, CaptchaSerializer
  22. def _get_details(request):
  23. path = request.path
  24. body = request.data
  25. query = request.query_params
  26. return {
  27. 'path': path,
  28. 'body': {**body, 'password': encryption(body.get('password', ''))},
  29. 'query': query
  30. }
  31. class LoginView(APIView):
  32. @extend_schema(methods=['POST'],
  33. description=_("Log in"),
  34. summary=_("Log in"),
  35. operation_id=_("Log in"), # type: ignore
  36. tags=[_("User Management")], # type: ignore
  37. request=LoginAPI.get_request(),
  38. responses=LoginAPI.get_response())
  39. @log(menu='User management', operate='Log in', get_user=lambda r: {'username': r.data.get('username', None)},
  40. get_details=_get_details,
  41. get_operation_object=lambda r, k: {'name': r.data.get('username')})
  42. def post(self, request: Request):
  43. return result.success(LoginSerializer().login(request.data))
  44. class Logout(APIView):
  45. authentication_classes = [TokenAuth]
  46. @extend_schema(methods=['POST'],
  47. summary=_("Sign out"),
  48. description=_("Sign out"),
  49. operation_id=_("Sign out"), # type: ignore
  50. tags=[_("User Management")], # type: ignore
  51. responses=DefaultModelResponse.get_response())
  52. @log(menu='User management', operate='Sign out',
  53. get_operation_object=lambda r, k: {'name': r.user.username})
  54. def post(self, request: Request):
  55. version, get_key = Cache_Version.TOKEN.value
  56. cache.delete(get_key(token=request.META.get('HTTP_AUTHORIZATION')[7:]), version=version)
  57. return result.success(True)
  58. class CaptchaView(APIView):
  59. @extend_schema(methods=['GET'],
  60. summary=_("Get captcha"),
  61. description=_("Get captcha"),
  62. operation_id=_("Get captcha"), # type: ignore
  63. tags=[_("User Management")], # type: ignore
  64. responses=CaptchaAPI.get_response())
  65. def get(self, request: Request):
  66. username = request.query_params.get('username', None)
  67. return result.success(CaptchaSerializer().generate(username))