-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFlaskSiteMainFile.py
More file actions
204 lines (152 loc) · 6.45 KB
/
Copy pathFlaskSiteMainFile.py
File metadata and controls
204 lines (152 loc) · 6.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
from flask import Flask, render_template, url_for, request, flash, session, redirect, abort, g, make_response
import sqlite3
import os
from FDataBase import FDataBase
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import LoginManager, login_user, login_required, logout_user, current_user
from UserLogin import UserLogin
from Forms import LoginForm, RegisterForm
# config
DATABASE = '/tmp/flsite.db'
DEBUG = True
SECRET_KEY = "fEH4LuHvT7Q$3Y'{]*^)"
MAX_CONTENT_LENGTH = 1024 * 1024
app = Flask(__name__)
app.config.from_object(__name__)
app.config.update(dict(DATABASE=os.path.join(app.root_path, 'flsite.db')))
login_manager = LoginManager(app)
login_manager.login_view = 'login'
login_manager.login_message = 'Авторизуйтесь для доступа к закрытым страницам'
login_manager.login_message_category = 'success'
dbase = None # БД будет сформирована в строке №50
def connect_db():
conn = sqlite3.connect(app.config['DATABASE'])
conn.row_factory = sqlite3.Row
return conn
def create_db():
"""Вспомогательная функция для создания БД"""
db = connect_db()
with app.open_resource('sq_db.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()
db.close()
def get_db():
"""Соединение с БД, если оно еще отсутсвует"""
if not hasattr(g, 'link_db'):
g.link_db = connect_db()
return g.link_db
@login_manager.user_loader
def load_user(user_id):
return UserLogin().fromDB(user_id, dbase)
@app.before_request
def before_request():
"""Установление соединения с БД перед каждым запросом"""
global dbase
db = get_db()
dbase = FDataBase(db)
@app.teardown_appcontext
def close_db(err):
"""Закрываем соединение с БД, если оно было установлено"""
if hasattr(g, 'link_db'):
g.link_db.close()
@app.errorhandler(404)
def PageNotFound(error):
return render_template('page404.html', title='Страница не найдена', menu=dbase.getMenu()), 404
@app.route("/")
def index():
return render_template('index.html', menu=dbase.getMenu(), posts=dbase.getPostsAnnounce())
@app.route("/about")
def about():
return render_template('about.html', title='О сайте', menu=dbase.getMenu())
@app.route("/contact", methods=['POST', 'GET'])
def contact():
if request.method == 'POST':
if len(request.form['username']) > 2:
flash('Сообщение отправлено', category='success')
else:
flash('Ошибка отправки', category='error')
return render_template('contact.html', title='Обратная связь', menu=dbase.getMenu())
@app.route("/login", methods=['POST', 'GET'])
def login():
if current_user.is_authenticated:
return redirect(url_for('profile'))
form = LoginForm()
if form.validate_on_submit(): # eq. of *if request.method == 'POST':*
user = dbase.getUserByEmail(form.email.data)
if user and check_password_hash(user['psw'], form.psw.data):
userlogin = UserLogin().create(user)
rm = form.remember.data
login_user(userlogin, remember=rm)
return redirect(request.args.get('next') or url_for('profile'))
flash('Неверная пара логин/пароль', 'error')
return render_template('login.html', menu=dbase.getMenu(), title='Авторизация', form=form)
@app.route("/register", methods=['POST', 'GET'])
def register():
form = RegisterForm()
if form.validate_on_submit():
hashed_data = generate_password_hash(form.psw.data)
res = dbase.addUser(form.name.data, form.email.data, hashed_data)
if res:
flash('Вы успешно зарегистрированы!', 'success')
return redirect(url_for('login'))
else:
flash('Ошибка при добавлении в БД', 'error')
return render_template('register.html', title='Регистрация', menu=dbase.getMenu(), form=form)
@app.route("/add_post", methods=['POST', 'GET'])
def addPost():
if request.method == 'POST':
if len(request.form['name']) > 4 and len(request.form['post']) > 10:
res = dbase.addPost(request.form['name'], request.form['post'], request.form['url'])
if not res:
flash('Ошибка добавления статьи', category='error')
else:
flash('Статья добавлена успешно', category='success')
else:
flash('Ошибка добавления статьи', category='error')
return render_template('add_post.html', menu=dbase.getMenu(), title='Добавление статьи')
@app.route("/post/<alias>")
@login_required
def showPost(alias):
title, post = dbase.getPost(alias)
if not title:
abort(404)
return render_template('post.html', menu=dbase.getMenu(), title=title, post=post)
@app.route("/logout")
@login_required
def logout():
logout_user()
flash('Вы вышли из аккаунта', 'success')
return redirect(url_for('login'))
@app.route("/profile")
@login_required
def profile():
return render_template('profile.html', menu=dbase.getMenu(), title='Профиль')
@app.route("/userava")
@login_required
def userava():
img = current_user.getAvatar(app)
if not img:
return ""
h = make_response(img)
h.headers['Content-Type'] = 'image/png'
return h
@app.route("/upload", methods=['POST', 'GET'])
@login_required
def upload():
if request.method == 'POST':
file = request.files['file']
if file and current_user.verifyExt(file.filename):
try:
img = file.read()
res = dbase.updateUserAvatar(img, current_user.get_id())
if not res:
flash('Ошибка обновления аватара', 'error')
flash('Аватар обновлён', 'success')
except FileNotFoundError as e:
print(f'Ошибка чтения файла {e}')
flash('Ошибка чтения файла', 'error')
else:
flash('Ошибка обновления аватара', 'error')
return redirect(url_for('profile'))
if __name__ == "__main__":
app.run(debug=True)