views.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. from django.shortcuts import render
  2. from .form import UserLoginForm, UserRegisterForm
  3. from django.contrib.auth import authenticate, login, logout
  4. from django.http import HttpResponse
  5. from .models import Profile, Devices
  6. from django.contrib.auth.models import User
  7. from django.contrib.auth.decorators import login_required
  8. from .form import ProfileForm
  9. import random
  10. import datetime
  11. import json
  12. """
  13. 在此处修改token过期时间,30代表30天过期
  14. """
  15. expiration_date = 30
  16. DEBUG = True
  17. def user_login(request):
  18. if request.method == 'POST':
  19. user_login_form = UserLoginForm(request.POST)
  20. if user_login_form.is_valid():
  21. # 清洗出合法的数据
  22. data = user_login_form.cleaned_data
  23. # 检测是否有登录凭证
  24. if data['token'] != 'token':
  25. try:
  26. device = Devices.objects.filter(token__exact=data['token']).get()
  27. sub_time = (device.last_login_time - datetime.date).total_seconds() / (3600 * 24)
  28. # 检查token是否过期
  29. if sub_time < expiration_date:
  30. # 更新此user此设备的token
  31. # token由设备uid、用户名、当前时间hash得来
  32. device.gen_token()
  33. device.save()
  34. # 登录
  35. user = device.user
  36. login(request, user)
  37. response = {'token': device.token}
  38. return HttpResponse(json.dumps(response), status=200)
  39. # return redirect("chat:index")
  40. else:
  41. return HttpResponse(status=420)
  42. # 已过期的token并且已经被删除
  43. except Devices.DoesNotExist:
  44. return HttpResponse(status=420)
  45. else:
  46. # 检测账号密码是否匹配数据库中的一个用户
  47. # 如果均匹配,则返回此User对象
  48. user = authenticate(username=data['username'], password=data['password'])
  49. if user:
  50. if data['token'] == 'token':
  51. # 新建一个该user的设备
  52. device = create_new_device(user)
  53. else:
  54. # 此时,客户端带来了过期的旧token,现在需要更新旧的token
  55. try:
  56. device = Devices.objects.filter(token__exact=data['token']).get()
  57. device.gen_token()
  58. device.save()
  59. except Devices.DoesNotExist:
  60. # 新建一个该user的设备
  61. device = create_new_device(user)
  62. login(request, user)
  63. response = {'token': device.token}
  64. return HttpResponse(json.dumps(response), status=200)
  65. else:
  66. return HttpResponse(status=401)
  67. else:
  68. return HttpResponse(status=400)
  69. # 用于测试,登录界面
  70. elif request.method == 'GET':
  71. if DEBUG:
  72. user_login_form = UserLoginForm()
  73. context = {'form': user_login_form}
  74. return render(request, 'login.html', context)
  75. else:
  76. # 请求方法错误,请使用POST
  77. return HttpResponse(status=400)
  78. # 新建一个该user的设备
  79. def create_new_device(user):
  80. device = Devices()
  81. device.user = user
  82. device.device_uid = generate_random_str(100)
  83. device.gen_token()
  84. device.save()
  85. return device
  86. def generate_random_str(random_length=16):
  87. """
  88. 生成一个指定长度的随机字符串
  89. """
  90. random_str = ''
  91. base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789'
  92. length = len(base_str) - 1
  93. for i in range(random_length):
  94. random_str += base_str[random.randint(0, length)]
  95. return random_str
  96. def user_logout(request):
  97. logout(request)
  98. return HttpResponse(status=200)
  99. def user_register(request):
  100. if request.method == 'POST':
  101. user_register_form = UserRegisterForm(data=request.POST)
  102. if user_register_form.is_valid():
  103. # 新建一个user,但是不提交
  104. new_user = user_register_form.save(commit=False)
  105. # 设置密码
  106. new_user.set_password(user_register_form.cleaned_data['password'])
  107. # 保存
  108. new_user.save()
  109. return HttpResponse(status=200)
  110. else:
  111. return HttpResponse(status=400)
  112. # 用于测试
  113. elif request.method == 'GET':
  114. if DEBUG:
  115. user_register_form = UserRegisterForm()
  116. context = {'form': user_register_form}
  117. return render(request, 'register.html', context)
  118. else:
  119. return HttpResponse(status=400)
  120. @login_required(login_url='/account/login/')
  121. def profile_edit(request, r_username):
  122. user = User.objects.get(username=r_username)
  123. profile = Profile.objects.get(user__exact=user)
  124. if request.method == 'POST':
  125. # 判断此用户是否正在修改自身账号信息
  126. if request.user != user:
  127. return HttpResponse(status=403)
  128. profile_form = ProfileForm(request.POST, request.FILES)
  129. if profile_form.is_valid():
  130. # 填入信息
  131. profile_cd = profile_form.cleaned_data
  132. profile.phone = profile_cd['phone']
  133. profile.bio = profile_cd['bio']
  134. if 'avatar' in request.FILES:
  135. profile.avatar = profile_cd["avatar"]
  136. profile.save()
  137. return HttpResponse(status=200)
  138. else:
  139. return HttpResponse(status=400)
  140. # 用于测试
  141. elif request.method == 'GET':
  142. if DEBUG:
  143. profile_form = ProfileForm()
  144. context = {'profile_form': profile_form, 'profile': profile, 'user': user}
  145. return render(request, 'edit.html', context)
  146. else:
  147. return HttpResponse(status=400)
  148. @login_required(login_url='/account/login/')
  149. def profile_detail(request, r_username):
  150. user = User.objects.get(username=r_username)
  151. profile = Profile.objects.get(user__exact=user)
  152. if request.method == 'POST':
  153. response = {}
  154. if profile.phone:
  155. response['phone'] = profile.phone
  156. else:
  157. response['phone'] = ''
  158. if profile.bio:
  159. response['bio'] = profile.bio
  160. else:
  161. response['bio'] = ''
  162. if profile.avatar:
  163. response['avatar'] = profile.avatar.url
  164. else:
  165. response['avatar'] = ''
  166. return HttpResponse(json.dumps(response), status=200)
  167. # 用于测试
  168. elif request.method == 'GET':
  169. if DEBUG:
  170. profile_form = ProfileForm()
  171. context = {'profile_form': profile_form, 'profile': profile, 'user': user}
  172. return render(request, 'edit.html', context)
  173. else:
  174. return HttpResponse(status=400)