main.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import datetime
  2. from flask import Flask, render_template, request, url_for
  3. from flask_login import login_user, current_user, LoginManager, logout_user, login_required
  4. from werkzeug.utils import redirect
  5. from itsdangerous import URLSafeTimedSerializer, SignatureExpired
  6. from functions import check_password, mail
  7. from forms.login import LoginForm
  8. from forms.register import RegisterForm
  9. from data.users import User
  10. from waitress import serve
  11. from data import db_session
  12. app = Flask(__name__)
  13. key = 'test_secret_key'
  14. app.config['SECRET_KEY'] = key
  15. s = URLSafeTimedSerializer(key)
  16. login_manager = LoginManager()
  17. login_manager.init_app(app)
  18. @app.route('/')
  19. def base():
  20. return render_template('main.html', title='Главная')
  21. @login_manager.user_loader
  22. def load_user(user_id):
  23. db_sess = db_session.create_session()
  24. return db_sess.query(User).get(user_id)
  25. @app.route('/login', methods=['GET', 'POST'])
  26. def login():
  27. if not current_user.is_authenticated:
  28. message = request.args.get('message') if request.args.get('message') else ''
  29. email_repeat = request.args.get('email_repeat') if request.args.get('email_repeat') else False
  30. form = LoginForm()
  31. if form.validate_on_submit():
  32. db_sess = db_session.create_session()
  33. user = db_sess.query(User).filter(User.email == form.email.data).first()
  34. if user and user.check_password(form.password.data):
  35. if user.activated:
  36. login_user(user, remember=form.remember_me.data)
  37. return redirect('/')
  38. else:
  39. return render_template('login.html',
  40. message="Ваша почта не подтверждена",
  41. form=form)
  42. return render_template('login.html',
  43. message="Неправильный логин или пароль",
  44. form=form)
  45. return render_template('login.html', title='Авторизация', form=form, message=message, email_repeat=email_repeat)
  46. else:
  47. return redirect('/')
  48. @app.route('/logout')
  49. @login_required
  50. def logout():
  51. logout_user()
  52. return redirect("/")
  53. @app.route('/register', methods=['GET', 'POST'])
  54. def register():
  55. if not current_user.is_authenticated:
  56. form = RegisterForm()
  57. if form.validate_on_submit():
  58. data_session = db_session.create_session()
  59. if data_session.query(User).filter(User.login == form.login.data).first():
  60. return render_template('register.html', form=form, message="Такой пользователь уже есть",
  61. title='Регистрация')
  62. if data_session.query(User).filter(User.email == form.email.data).first():
  63. return render_template('register.html', form=form, message="Такая почта уже есть", title='Регистрация')
  64. status_password = check_password(form.password.data)
  65. if status_password != 'OK':
  66. return render_template('register.html', form=form, message=status_password, title='Регистрация')
  67. user = User(
  68. email=form.email.data,
  69. name=form.name.data,
  70. login=form.login.data,
  71. activity=datetime.datetime.now()
  72. )
  73. user.set_password(form.password.data)
  74. data_session.add(user)
  75. data_session.commit()
  76. data_session.close()
  77. token = s.dumps(form.email.data)
  78. link_conf = url_for('confirmation', token=token, _external=True)
  79. mail(f'Для завершения регистрации пройдите по ссылке: {link_conf}', form.email.data,
  80. 'Подтверждение регистрации')
  81. return redirect('/login?message=Мы выслали ссылку для подтверждения почты')
  82. return render_template('register.html', form=form, message='', title='Регистрация')
  83. else:
  84. return redirect('/')
  85. @app.route('/confirmation/<token>')
  86. def confirmation(token):
  87. try:
  88. user_email = s.loads(token, max_age=86400)
  89. data_session = db_session.create_session()
  90. user = data_session.query(User).filter(User.email == user_email).first()
  91. if user:
  92. user.activated = True
  93. data_session.commit()
  94. data_session.close()
  95. return redirect('/login?message=Почта успешно подтверждена')
  96. else:
  97. return redirect('/login?message=Пользователь не найден')
  98. except SignatureExpired:
  99. data_session = db_session.create_session()
  100. users = data_session.query(User).filter(
  101. User.activated == 0 and User.activated < datetime.datetime.now() - datetime.timedelta(days=1)).all()
  102. if users:
  103. list(map(lambda x: data_session.delete(x), users))
  104. data_session.commit()
  105. data_session.close()
  106. return redirect('/login?message=Срок действия ссылки истек, данные удалены')
  107. def main():
  108. db_session.global_init("db/incepted.db")
  109. serve(app, host='0.0.0.0', port=5000)
  110. if __name__ == '__main__':
  111. main()