main.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import datetime
  2. import os
  3. from flask import Flask, render_template, request, url_for
  4. from flask_login import login_user, current_user, LoginManager, logout_user, login_required
  5. from werkzeug.datastructures import CombinedMultiDict
  6. from werkzeug.utils import redirect
  7. from itsdangerous import URLSafeTimedSerializer, SignatureExpired
  8. from functions import check_password, mail
  9. from forms.edit_profile import EditProfileForm
  10. from forms.login import LoginForm
  11. from forms.register import RegisterForm
  12. from data.users import User
  13. from waitress import serve
  14. from data import db_session
  15. app = Flask(__name__)
  16. key = 'test_secret_key'
  17. app.config['SECRET_KEY'] = key
  18. s = URLSafeTimedSerializer(key)
  19. login_manager = LoginManager()
  20. login_manager.init_app(app)
  21. @app.route('/')
  22. def base():
  23. if not current_user.is_authenticated:
  24. return render_template('main.html', title='Главная')
  25. else:
  26. return redirect('/project')
  27. @app.route('/project')
  28. def project():
  29. if current_user.is_authenticated:
  30. return redirect(f'/profile')
  31. else:
  32. return redirect('/login')
  33. @app.route('/profile', methods=['GET', 'POST'])
  34. def profile():
  35. if current_user.is_authenticated:
  36. form = EditProfileForm(
  37. CombinedMultiDict((request.files, request.form)),
  38. email=current_user.email,
  39. name=current_user.name,
  40. surname=current_user.surname,
  41. about=current_user.about,
  42. birthday=current_user.birthday
  43. )
  44. if form.del_photo.data:
  45. data_session = db_session.create_session()
  46. user = data_session.query(User).filter(User.id == current_user.id).first()
  47. if not user:
  48. return render_template('profile.html', title='Профиль', form=form,
  49. message='Ошибка, пользователь ненайден')
  50. os.remove(current_user.photo)
  51. user.photo = 'static/images/none_logo.png'
  52. data_session.commit()
  53. data_session.close()
  54. if form.validate_on_submit():
  55. data_session = db_session.create_session()
  56. user = data_session.query(User).filter(User.id == current_user.id).first()
  57. if not user:
  58. return render_template('profile.html', title='Профиль', form=form,
  59. message='Ошибка, пользователь ненайден')
  60. if form.email.data != current_user.email:
  61. pass
  62. if form.photo.data:
  63. with open(f'static/app_files/user_logo/{current_user.login}.png', 'wb') as file:
  64. form.photo.data.save(file)
  65. user.photo = f'static/app_files/user_logo/{current_user.login}.png'
  66. user.name = form.name.data
  67. user.surname = form.surname.data
  68. user.about = form.about.data
  69. user.birthday = form.birthday.data
  70. data_session.commit()
  71. data_session.close()
  72. return redirect('/profile')
  73. return render_template('profile.html', title='Профиль', form=form, message='')
  74. else:
  75. return redirect('/login')
  76. @login_manager.user_loader
  77. def load_user(user_id):
  78. db_sess = db_session.create_session()
  79. return db_sess.query(User).get(user_id)
  80. @app.route('/login', methods=['GET', 'POST'])
  81. def login():
  82. if not current_user.is_authenticated:
  83. message = request.args.get('message') if request.args.get('message') else ''
  84. danger = request.args.get('danger') if request.args.get('danger') else False
  85. form = LoginForm()
  86. if form.validate_on_submit():
  87. db_sess = db_session.create_session()
  88. user = db_sess.query(User).filter(User.email == form.login.data).first()
  89. if user and user.check_password(form.password.data):
  90. if user.activated:
  91. login_user(user, remember=form.remember_me.data)
  92. return redirect('/')
  93. else:
  94. return render_template('login.html',
  95. message="Ваша почта не подтверждена",
  96. danger=True,
  97. form=form)
  98. return render_template('login.html',
  99. message="Неправильный логин или пароль",
  100. danger=True,
  101. form=form)
  102. return render_template('login.html', title='Авторизация', form=form, message=message,
  103. danger=danger)
  104. else:
  105. return redirect('/project')
  106. @app.route('/logout')
  107. @login_required
  108. def logout():
  109. logout_user()
  110. return redirect("/")
  111. @app.route('/register', methods=['GET', 'POST'])
  112. def register():
  113. if not current_user.is_authenticated:
  114. form = RegisterForm()
  115. if form.validate_on_submit():
  116. data_session = db_session.create_session()
  117. if data_session.query(User).filter(User.login == form.login.data).first():
  118. return render_template('register.html', form=form, message="Такой пользователь уже есть",
  119. title='Регистрация')
  120. if data_session.query(User).filter(User.email == form.email.data).first():
  121. return render_template('register.html', form=form, message="Такая почта уже есть", title='Регистрация')
  122. status_password = check_password(form.password.data)
  123. if status_password != 'OK':
  124. return render_template('register.html', form=form, message=status_password, title='Регистрация')
  125. user = User(
  126. email=form.email.data,
  127. name=form.name.data,
  128. login=form.login.data,
  129. activity=datetime.datetime.now(),
  130. data_reg=datetime.date.today(),
  131. photo='static/images/none_logo.png',
  132. role='user'
  133. )
  134. user.set_password(form.password.data)
  135. data_session.add(user)
  136. data_session.commit()
  137. data_session.close()
  138. token = s.dumps(form.email.data)
  139. link_conf = url_for('confirmation', token=token, _external=True)
  140. mail(f'Для завершения регистрации пройдите по ссылке: {link_conf}', form.email.data,
  141. 'Подтверждение регистрации')
  142. return redirect('/login?message=Мы выслали ссылку для подтверждения почты')
  143. return render_template('register.html', form=form, message='', title='Регистрация')
  144. else:
  145. return redirect('/project')
  146. @app.route('/confirmation/<token>')
  147. def confirmation(token):
  148. try:
  149. user_email = s.loads(token, max_age=86400)
  150. data_session = db_session.create_session()
  151. user = data_session.query(User).filter(User.email == user_email).first()
  152. if user:
  153. user.activated = True
  154. data_session.commit()
  155. data_session.close()
  156. return redirect('/login?message=Почта успешно подтверждена')
  157. else:
  158. return redirect('/login?message=Пользователь не найден&danger=True')
  159. except SignatureExpired:
  160. data_session = db_session.create_session()
  161. users = data_session.query(User).filter(
  162. User.activated == 0 and User.activated < datetime.datetime.now() - datetime.timedelta(days=1)).all()
  163. if users:
  164. list(map(lambda x: data_session.delete(x), users))
  165. data_session.commit()
  166. data_session.close()
  167. return redirect('/login?message=Срок действия ссылки истек, данные удалены&danger=True')
  168. def main():
  169. db_session.global_init("db/incepted.db")
  170. serve(app, host='0.0.0.0', port=5000)
  171. if __name__ == '__main__':
  172. main()