views.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: views.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-10-28 10:26:10 (CST)
  9. # Last Update:星期四 2016-12-29 22:24:8 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import request, url_for, render_template, redirect
  14. from flask.views import MethodView
  15. from flask_login import login_user, logout_user, current_user, login_required
  16. from flask_babelex import gettext as _
  17. from flask_maple.serializer import Serializer
  18. from flask_maple.auth.forms import (LoginForm, RegisterForm, ForgetForm,
  19. form_validate)
  20. from api.user.models import User
  21. from common.response import HTTPResponse
  22. from random import sample
  23. from string import ascii_letters, digits
  24. class LoginView(MethodView):
  25. def get(self):
  26. form = LoginForm()
  27. data = {'form': form}
  28. return render_template('auth/login.html', **data)
  29. @form_validate(LoginForm)
  30. def post(self):
  31. form = LoginForm()
  32. post_data = form.data
  33. username = post_data.pop('username', None)
  34. password = post_data.pop('password', None)
  35. remember = post_data.pop('remember', None)
  36. remember = True if remember else None
  37. user = User.query.filter_by(username=username).first()
  38. if user and user.check_password(password):
  39. login_user(user, remember=remember)
  40. serializer = Serializer(user, many=False, depth=1)
  41. return HTTPResponse(
  42. HTTPResponse.NORMAL_STATUS, data=serializer.data).to_response()
  43. return HTTPResponse(
  44. HTTPResponse.AUTH_USER_OR_PASSWORD_ERROR).to_response()
  45. class LogoutView(MethodView):
  46. @login_required
  47. def get(self):
  48. logout_user()
  49. return redirect(request.args.get('next') or '/')
  50. class RegisterView(MethodView):
  51. def get(self):
  52. form = RegisterForm()
  53. data = {'form': form}
  54. return render_template('auth/register.html', **data)
  55. @form_validate(RegisterForm)
  56. def post(self):
  57. form = RegisterForm()
  58. post_data = form.data
  59. username = post_data.pop('username', None)
  60. email = post_data.pop('email', None)
  61. password = post_data.pop('password', None)
  62. user = User.query.filter_by(username=username).first()
  63. if user is not None:
  64. return HTTPResponse(HTTPResponse.AUTH_USERNAME_UNIQUE).to_response(
  65. )
  66. user = User.query.filter_by(email=email).first()
  67. if user is not None:
  68. return HTTPResponse(HTTPResponse.AUTH_EMAIL_UNIQUE).to_response()
  69. user = User(username=username, email=email)
  70. user.set_password(password)
  71. user.save()
  72. login_user(user)
  73. self.email(user)
  74. return HTTPResponse(HTTPResponse.NORMAL_STATUS).to_response()
  75. def email(self, user):
  76. token = user.email_token
  77. confirm_url = url_for(
  78. 'auth.confirm_token', token=token, _external=True)
  79. html = render_template('templet/email.html', confirm_url=confirm_url)
  80. subject = _("Please confirm your email!")
  81. user.send_email(subject=subject, html=html)
  82. class ForgetView(MethodView):
  83. def get(self):
  84. form = ForgetForm()
  85. data = {'form': form}
  86. return render_template('auth/forget.html', **data)
  87. @form_validate(ForgetForm)
  88. def post(self):
  89. form = ForgetForm()
  90. post_data = form.data
  91. email = post_data.pop('email', None)
  92. user = User.query.filter_by(email=email).first()
  93. if not user:
  94. return HTTPResponse(
  95. HTTPResponse.AUTH_EMAIL_NOT_REGISTER).to_response()
  96. password = ''.join(sample(ascii_letters + digits, 12))
  97. user.set_password(password)
  98. user.save()
  99. self.email(user)
  100. return HTTPResponse(HTTPResponse.NORMAL_STATUS).to_response()
  101. def email(self, user):
  102. html = render_template(
  103. 'templet/forget.html', confirm_url=user.password)
  104. subject = "Please update your password in time"
  105. user.send_email(html, subject)
  106. class ConfirmView(MethodView):
  107. @login_required
  108. def post(self):
  109. if current_user.is_confirmed:
  110. return HTTPResponse(
  111. HTTPResponse.AUTH_USER_IS_CONFIRMED).to_response()
  112. token = current_user.email_token()
  113. confirm_url = url_for(
  114. 'auth.confirm_token', token=token, _external=True)
  115. html = render_template('templet/email.html', confirm_url=confirm_url)
  116. subject = _("Please confirm your email")
  117. current_user.send_email(html, subject)
  118. return HTTPResponse(HTTPResponse.NORMAL_STATUS).to_response()
  119. class ConfirmTokenView(MethodView):
  120. def get(self, token):
  121. user = User.check_email_token(token)
  122. if not user:
  123. return HTTPResponse(
  124. HTTPResponse.AUTH_TOKEN_VERIFY_FAIL).to_response()
  125. if user.is_confirmed:
  126. return HTTPResponse(
  127. HTTPResponse.AUTH_USER_IS_CONFIRMED).to_response()
  128. user.is_confirmed = True
  129. user.save()
  130. return HTTPResponse(HTTPResponse.NORMAL_STATUS).to_response()