main.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. danger = request.args.get('danger') if request.args.get('danger') 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.login.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. danger=True,
  42. form=form)
  43. return render_template('login.html',
  44. message="Неправильный логин или пароль",
  45. danger=True,
  46. form=form)
  47. return render_template('login.html', title='Авторизация', form=form, message=message,
  48. danger=danger)
  49. else:
  50. return redirect('/')
  51. @app.route('/logout')
  52. @login_required
  53. def logout():
  54. logout_user()
  55. return redirect("/")
  56. @app.route('/register', methods=['GET', 'POST'])
  57. def register():
  58. if not current_user.is_authenticated:
  59. form = RegisterForm()
  60. if form.validate_on_submit():
  61. data_session = db_session.create_session()
  62. if data_session.query(User).filter(User.login == form.login.data).first():
  63. return render_template('register.html', form=form, message="Такой пользователь уже есть",
  64. title='Регистрация')
  65. if data_session.query(User).filter(User.email == form.email.data).first():
  66. return render_template('register.html', form=form, message="Такая почта уже есть", title='Регистрация')
  67. status_password = check_password(form.password.data)
  68. if status_password != 'OK':
  69. return render_template('register.html', form=form, message=status_password, title='Регистрация')
  70. user = User(
  71. email=form.email.data,
  72. name=form.name.data,
  73. login=form.login.data,
  74. activity=datetime.datetime.now()
  75. )
  76. user.set_password(form.password.data)
  77. data_session.add(user)
  78. data_session.commit()
  79. data_session.close()
  80. token = s.dumps(form.email.data)
  81. link_conf = url_for('confirmation', token=token, _external=True)
  82. mail(f'Для завершения регистрации пройдите по ссылке: {link_conf}', form.email.data,
  83. 'Подтверждение регистрации')
  84. return redirect('/login?message=Мы выслали ссылку для подтверждения почты')
  85. return render_template('register.html', form=form, message='', title='Регистрация')
  86. else:
  87. return redirect('/')
  88. @app.route('/confirmation/<token>')
  89. def confirmation(token):
  90. try:
  91. user_email = s.loads(token, max_age=86400)
  92. data_session = db_session.create_session()
  93. user = data_session.query(User).filter(User.email == user_email).first()
  94. if user:
  95. user.activated = True
  96. data_session.commit()
  97. data_session.close()
  98. return redirect('/login?message=Почта успешно подтверждена')
  99. else:
  100. return redirect('/login?message=Пользователь не найден&danger=True')
  101. except SignatureExpired:
  102. data_session = db_session.create_session()
  103. users = data_session.query(User).filter(
  104. User.activated == 0 and User.activated < datetime.datetime.now() - datetime.timedelta(days=1)).all()
  105. if users:
  106. list(map(lambda x: data_session.delete(x), users))
  107. data_session.commit()
  108. data_session.close()
  109. return redirect('/login?message=Срок действия ссылки истек, данные удалены&danger=True')
  110. def main():
  111. db_session.global_init("db/incepted.db")
  112. serve(app, host='0.0.0.0', port=5000)
  113. if __name__ == '__main__':
  114. main()