main.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. data_session = db_session.create_session()
  88. user = data_session.query(User).filter(User.email == form.login.data).first()
  89. if not user:
  90. user = data_session.query(User).filter(User.login == form.login.data).first()
  91. data_session.close()
  92. if user and user.check_password(form.password.data):
  93. if user.activated:
  94. login_user(user, remember=form.remember_me.data)
  95. return redirect('/')
  96. else:
  97. return render_template('login.html',
  98. message="Ваша почта не подтверждена",
  99. danger=True,
  100. form=form)
  101. return render_template('login.html',
  102. message="Неправильный логин или пароль",
  103. danger=True,
  104. form=form)
  105. return render_template('login.html', title='Авторизация', form=form, message=message,
  106. danger=danger)
  107. else:
  108. return redirect('/project')
  109. @app.route('/logout')
  110. @login_required
  111. def logout():
  112. logout_user()
  113. return redirect("/")
  114. @app.route('/register', methods=['GET', 'POST'])
  115. def register():
  116. if not current_user.is_authenticated:
  117. form = RegisterForm()
  118. if form.validate_on_submit():
  119. data_session = db_session.create_session()
  120. if data_session.query(User).filter(User.login == form.login.data).first():
  121. return render_template('register.html', form=form, message="Такой пользователь уже есть",
  122. title='Регистрация')
  123. if data_session.query(User).filter(User.email == form.email.data).first():
  124. return render_template('register.html', form=form, message="Такая почта уже есть", title='Регистрация')
  125. status_password = check_password(form.password.data)
  126. if status_password != 'OK':
  127. return render_template('register.html', form=form, message=status_password, title='Регистрация')
  128. user = User(
  129. email=form.email.data,
  130. name=form.name.data,
  131. login=form.login.data,
  132. activity=datetime.datetime.now(),
  133. data_reg=datetime.date.today(),
  134. photo='static/images/none_logo.png',
  135. role='user'
  136. )
  137. user.set_password(form.password.data)
  138. data_session.add(user)
  139. data_session.commit()
  140. data_session.close()
  141. token = s.dumps(form.email.data)
  142. link_conf = url_for('confirmation', token=token, _external=True)
  143. mail(f'Для завершения регистрации пройдите по ссылке: {link_conf}', form.email.data,
  144. 'Подтверждение регистрации')
  145. return redirect('/login?message=Мы выслали ссылку для подтверждения почты')
  146. return render_template('register.html', form=form, message='', title='Регистрация')
  147. else:
  148. return redirect('/project')
  149. @app.route('/confirmation/<token>')
  150. def confirmation(token):
  151. try:
  152. user_email = s.loads(token, max_age=86400)
  153. data_session = db_session.create_session()
  154. user = data_session.query(User).filter(User.email == user_email).first()
  155. if user:
  156. user.activated = True
  157. data_session.commit()
  158. data_session.close()
  159. return redirect('/login?message=Почта успешно подтверждена')
  160. else:
  161. return redirect('/login?message=Пользователь не найден&danger=True')
  162. except SignatureExpired:
  163. data_session = db_session.create_session()
  164. users = data_session.query(User).filter(
  165. User.activated == 0 and User.activated < datetime.datetime.now() - datetime.timedelta(days=1)).all()
  166. if users:
  167. list(map(lambda x: data_session.delete(x), users))
  168. data_session.commit()
  169. data_session.close()
  170. return redirect('/login?message=Срок действия ссылки истек, данные удалены&danger=True')
  171. def main():
  172. db_session.global_init("db/incepted.db")
  173. serve(app, host='0.0.0.0', port=5000)
  174. if __name__ == '__main__':
  175. main()