home.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from flask import blueprints, url_for, request, redirect, render_template, flash, current_app, abort, g
  2. from flask_login import login_user, current_user, login_required, logout_user
  3. from wtforms import PasswordField, BooleanField, SubmitField, SelectField
  4. from wtforms.validators import DataRequired, EqualTo, ValidationError
  5. import configure
  6. from app.user import load_user, create_user, check_template, get_template, have_user
  7. from app.tool import form_required, AuthForm
  8. home = blueprints.Blueprint("home", __name__)
  9. class LoginForm(AuthForm):
  10. remember = BooleanField("Remember me", default=True)
  11. submit = SubmitField("Login")
  12. def __init__(self):
  13. super(LoginForm, self).__init__()
  14. class RegisterForm(AuthForm):
  15. template = SelectField("Template", choices=get_template(), coerce=str,
  16. validators=[DataRequired(message="Template must be selected")], default="base")
  17. passwd_again = PasswordField("Passwd again",
  18. validators=[DataRequired(message="Must enter password again"),
  19. EqualTo("passwd", message="The password entered twice is different")])
  20. invite_passwd = PasswordField("Invite passwd")
  21. submit = SubmitField("register")
  22. def __init__(self):
  23. super(RegisterForm, self).__init__()
  24. def validate_name(self, field):
  25. if have_user(field.data):
  26. raise ValidationError("User is already exist")
  27. def validate_template(self, field):
  28. if not check_template(field.data):
  29. raise ValidationError("Template does not exist")
  30. def __load_index(login_form: LoginForm, register_form: RegisterForm):
  31. if not current_user.is_anonymous:
  32. return redirect(url_for("test.question"))
  33. return render_template("index.html", login_form=login_form, register_form=register_form)
  34. @home.route("/", methods=["GET"])
  35. def index():
  36. if not current_user.is_anonymous:
  37. return redirect(url_for("test.question"))
  38. return __load_index(LoginForm(), RegisterForm())
  39. @home.route("/login", methods=["POST"])
  40. @form_required(LoginForm, lambda form: __load_index(form, RegisterForm()))
  41. def login():
  42. if not current_user.is_anonymous:
  43. current_app.logger.debug(f"re-login and abort(304)")
  44. flash(f"You are login as {current_user.user}")
  45. abort(304)
  46. login_form: LoginForm = g.form
  47. user = load_user(login_form.name.data, login_form.passwd.data)
  48. if user is not None:
  49. login_user(user, login_form.remember.data)
  50. next_page = request.args.get("next")
  51. if next_page is None or not next_page.startswith('/'):
  52. next_page = url_for('home.index')
  53. flash("Login success")
  54. current_app.logger.info(f"{login_form.name.data} login success")
  55. return redirect(next_page)
  56. flash("Login fail")
  57. current_app.logger.debug(f"{login_form.name.data} login fail")
  58. return redirect(url_for("home.index"))
  59. @home.route("/register", methods=["POST"])
  60. @form_required(RegisterForm, lambda form: __load_index(LoginForm(), form))
  61. def register():
  62. if not current_user.is_anonymous:
  63. current_app.logger.debug(f"re-login and register(304)")
  64. flash(f"You are login as {current_user.user}")
  65. abort(304)
  66. register_form: RegisterForm = g.form
  67. if current_app.invite_passwd != register_form.invite_passwd.data:
  68. flash("Register without invite")
  69. return redirect(url_for("home.index"))
  70. current_app.new_invite_passwd()
  71. print(register_form.template.data)
  72. flat, user = create_user(register_form.template.data, register_form.name.data, register_form.passwd.data)
  73. if user is not None:
  74. current_app.logger.debug(f"{register_form.name.data} with {register_form.template.data} register success")
  75. flash("Register success")
  76. else:
  77. current_app.logger.debug(
  78. f"{register_form.name.data} with {register_form.template.data} register fail [{flat}]")
  79. flash("User is already exist")
  80. return redirect(url_for("home.index"))
  81. @home.route('/logout')
  82. @login_required
  83. def logout():
  84. logout_user()
  85. flash("User logout")
  86. return redirect(url_for("home.index"))
  87. @home.route('/invite/<string:url>')
  88. def invite(url: str):
  89. if url != configure.conf["INVITE_URL"]:
  90. return abort(404)
  91. return render_template("invite.html", invite_passwd=current_app.invite_passwd)