views.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. from string import printable, ascii_letters, digits
  13. import string
  14. def auth_with_username_or_email(username, password):
  15. if '@' in username:
  16. user = User.objects.get(email=username, password=password)
  17. else:
  18. user = User.objects.get(username=username, password=password)
  19. return user
  20. def check_password(password):
  21. if set(password).isdisjoint(ascii_letters) and set(password).isdisjoint(digits):
  22. return False
  23. return set(password).issubset(printable) and len(password) >= 8
  24. @secure_transport
  25. # @debug_view('password', 'email')
  26. @require_POST
  27. def register(request):
  28. username = request.POST.get('username', '')
  29. password = request.POST.get('password', '')
  30. email = request.POST.get('email', '')
  31. if not username or not password or not email:
  32. return make_json_response(code=303, error='用户名/密码/邮箱不能为空')
  33. if User.objects.filter(username=username):
  34. return make_json_response(code=301, error='用户名已存在')
  35. if User.objects.filter(email=email):
  36. return make_json_response(code=302, error='邮箱已存在')
  37. if not check_password(password):
  38. return make_json_response(code=304, error='密码长度不能小于8, 必须包含数字和英文字符')
  39. try:
  40. User.objects.create(username=username, password=password, email=email)
  41. print('注册成功')
  42. return make_json_response()
  43. except Exception as e:
  44. return make_json_response(code=500, error=str(e))
  45. @secure_transport
  46. # @debug_view
  47. @require_POST
  48. def login(request):
  49. username = request.POST.get('username', '')
  50. password = request.POST.get('password', '')
  51. old_token = request.POST.get('token', '')
  52. try:
  53. user = auth_with_username_or_email(username, password)
  54. print(user)
  55. except:
  56. return make_json_response(code=303, error='用户名或密码错误')
  57. print(f'token = {old_token}')
  58. if user.check_token(old_token):
  59. try:
  60. user_token = user.tokens.get(token=old_token)
  61. print('已登录')
  62. user_token.delete()
  63. # return JsonResponse({'code': 303, 'msg': '已登录'}, status=303)
  64. except Exception as e:
  65. print('token无效')
  66. else:
  67. print('token已过期')
  68. user.last_login = datetime.now()
  69. token = user.make_token()
  70. user_token = LoginToken()
  71. user_token.user = user
  72. user_token.token = token
  73. user_token.save()
  74. print('登录成功')
  75. print(f'token = {token}')
  76. return make_json_response(token=token)
  77. @secure_transport
  78. # @debug_view()
  79. @login_required
  80. def logout(request):
  81. user = get_user(request)
  82. data = request.POST
  83. token = data.get('token')
  84. user_token = user.tokens.get(token=token)
  85. user_token.delete()
  86. return make_json_response()
  87. @secure_transport
  88. # @debug_view('email')
  89. @require_POST
  90. def send_email_verification_code(request):
  91. data = request.POST
  92. username = data.get('username')
  93. email = data.get('email')
  94. try:
  95. user = User.objects.get(username=username)
  96. except:
  97. return make_json_response(code=302, error='用户不存在')
  98. if user.email != email:
  99. return make_json_response(code=301, error='邮箱错误')
  100. try:
  101. # 发送验证码
  102. token = user.make_token()
  103. print(f'发送验证码 email = {user.email} token = {token}')
  104. user.send_email('ST网盘重置密码验证码', token)
  105. return make_json_response()
  106. except Exception as e:
  107. print(e)
  108. return make_json_response(code=500, error='验证码发送失败')
  109. @secure_transport
  110. # @debug_view()
  111. @require_POST
  112. def check_token(request):
  113. data = request.POST
  114. username = data.get('username')
  115. token = data.get('token')
  116. print(username)
  117. try:
  118. user = User.objects.get(username=username)
  119. except:
  120. return make_json_response(code=302, error='用户不存在')
  121. print(f'token={token}')
  122. if token and user.check_token(token):
  123. print('验证码有效')
  124. return make_json_response()
  125. else:
  126. return make_json_response(code=303, error='验证码无效')
  127. @secure_transport
  128. # @debug_view('password')
  129. @require_POST
  130. def reset_password(request):
  131. data = request.POST
  132. username = data.get('username')
  133. password = data.get('password')
  134. token = data.get('token')
  135. if not check_password(password):
  136. return make_json_response(code=304, error='密码长度不能小于8, 必须包含数字和英文字符')
  137. try:
  138. user = User.objects.get(username=username)
  139. except:
  140. return make_json_response(code=302, error='用户不存在')
  141. print(f'token={token}')
  142. if token and user.check_token(token):
  143. # 重置密码
  144. print("验证码有效")
  145. user.password = password
  146. user.save()
  147. return make_json_response()
  148. else:
  149. return make_json_response(code=303, error='验证码无效')