views.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. from django.shortcuts import render
  2. # Create your views here.
  3. from datetime import datetime, time
  4. from .models import User, LoginToken
  5. from django.http import JsonResponse
  6. from utils.debug import debug_view
  7. from utils.crypto import secure_transport
  8. from utils.http import make_json_response
  9. from .models import get_user
  10. from django.views.decorators.http import require_POST
  11. from .decorators import login_required
  12. def auth_with_username_or_email(username, password):
  13. if '@' in username:
  14. user = User.objects.get(email=username, password=password)
  15. else:
  16. user = User.objects.get(username=username, password=password)
  17. return user
  18. @secure_transport
  19. # @debug_view('password', 'email')
  20. @require_POST
  21. def register(request):
  22. username = request.POST.get('username', '')
  23. password = request.POST.get('password', '')
  24. email = request.POST.get('email', '')
  25. if not username or not password or not email:
  26. return make_json_response(code=303, error='用户名/密码/邮箱不能为空')
  27. if User.objects.filter(username=username):
  28. return make_json_response(code=301, error='用户名已存在')
  29. if User.objects.filter(email=email):
  30. return make_json_response(code=302, error='邮箱已存在')
  31. try:
  32. User.objects.create(username=username, password=password, email=email)
  33. print('注册成功')
  34. return make_json_response()
  35. except Exception as e:
  36. return make_json_response(code=500, error=str(e))
  37. @secure_transport
  38. # @debug_view
  39. @require_POST
  40. def login(request):
  41. username = request.POST.get('username', '')
  42. password = request.POST.get('password', '')
  43. old_token = request.POST.get('token', '')
  44. try:
  45. user = auth_with_username_or_email(username, password)
  46. print(user)
  47. except:
  48. return make_json_response(code=303, error='用户名或密码错误')
  49. print(f'token = {old_token}')
  50. if user.check_token(old_token):
  51. try:
  52. user_token = user.tokens.get(token=old_token)
  53. print('已登录')
  54. user_token.delete()
  55. # return JsonResponse({'code': 303, 'msg': '已登录'}, status=303)
  56. except Exception as e:
  57. print('token无效')
  58. else:
  59. print('token已过期')
  60. user.last_login = datetime.now()
  61. token = user.make_token()
  62. user_token = LoginToken()
  63. user_token.user = user
  64. user_token.token = token
  65. user_token.save()
  66. print('登录成功')
  67. print(f'token = {token}')
  68. return make_json_response(token=token)
  69. @secure_transport
  70. # @debug_view()
  71. @login_required
  72. def logout(request):
  73. user = get_user(request)
  74. data = request.POST
  75. token = data.get('token')
  76. user_token = user.tokens.get(token=token)
  77. user_token.delete()
  78. return make_json_response()
  79. @secure_transport
  80. @debug_view('email')
  81. @require_POST
  82. def send_email_verification_code(request):
  83. data = request.POST
  84. username = data.get('username')
  85. email = data.get('email')
  86. try:
  87. user = User.objects.get(username=username)
  88. except:
  89. return make_json_response(code=302, error='用户不存在')
  90. if user.email != email:
  91. return make_json_response(code=301, error='邮箱错误')
  92. try:
  93. # 发送验证码
  94. token = user.make_token()
  95. print(f'发送验证码 email = {user.email} token = {token}')
  96. user.send_email('ST网盘重置密码验证码', token)
  97. return make_json_response()
  98. except Exception as e:
  99. print(e)
  100. return make_json_response(code=500, error='验证码发送失败')
  101. @secure_transport
  102. @debug_view()
  103. @require_POST
  104. def check_token(request):
  105. data = request.POST
  106. username = data.get('username')
  107. token = data.get('token')
  108. print(username)
  109. try:
  110. user = User.objects.get(username=username)
  111. except:
  112. return make_json_response(code=302, error='用户不存在')
  113. print(f'token={token}')
  114. if token and user.check_token(token):
  115. print('验证码有效')
  116. return make_json_response()
  117. else:
  118. return make_json_response(code=303, error='验证码无效')
  119. @secure_transport
  120. @debug_view('password')
  121. @require_POST
  122. def reset_password(request):
  123. data = request.POST
  124. username = data.get('username')
  125. password = data.get('password')
  126. token = data.get('token')
  127. try:
  128. user = User.objects.get(username=username)
  129. except:
  130. return make_json_response(code=302, error='用户不存在')
  131. print(f'token={token}')
  132. if token and user.check_token(token):
  133. # 重置密码
  134. print("验证码有效")
  135. user.password = password
  136. user.save()
  137. return make_json_response()
  138. else:
  139. return make_json_response(code=303, error='验证码无效')