Введение
В этом практическом занятии мы рассмотрим, как создавать и использовать блюпринты Flask для структурирования вашего приложения с использованием представлений. Блюпринты Flask позволяют группировать связанные представления, код и ресурсы, делая ваше приложение модульным и масштабируемым. Мы создадим простое приложение, которое будет включать в себя функциональность аутентификации пользователей и блоговых постов.
Примечание: вам нужно создать файл кода самостоятельно и запустить его в среде. Вы можете просмотреть статус сервиса Flask на Web 5000.
Создайте блюпринт
Давайте начнем с создания блюпринта для нашего приложения. Этот блюпринт будет называться 'auth' и будет обрабатывать представления, связанные с аутентификацией пользователей. Мы определим наш блюпринт в отдельном модуле с именем flaskr/auth.py.
## flaskr/auth.py
import functools
from flask import Blueprint, flash, g, redirect, render_template, request, session, url_for
from werkzeug.security import check_password_hash, generate_password_hash
from flaskr.db import get_db
## Создайте блюпринт с именем 'auth'
bp = Blueprint('auth', __name__, url_prefix='/auth')
Зарегистрируйте блюпринт
После создания блюпринта нам нужно зарегистрировать его в нашем приложении. Это делается в функции-фабрике приложения в flaskr/__init__.py.
## flaskr/__init__.py
def create_app():
app =...
## существующий код опущен
## Импортируйте и зарегистрируйте блюпринт
from. import auth
app.register_blueprint(auth.bp)
return app
Реализуйте представление регистрации
Теперь давайте реализуем представление регистрации в flaskr/auth.py. Это представление будет отображать форму регистрации и обрабатывать отправку формы.
## flaskr/auth.py
@bp.route('/register', methods=('GET', 'POST'))
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
error = None
if not username:
error = 'Имя пользователя обязательно.'
elif not password:
error = 'Пароль обязателен.'
if error is None:
try:
db.execute(
"INSERT INTO user (username, password) VALUES (?,?)",
(username, generate_password_hash(password)),
)
db.commit()
except db.IntegrityError:
error = f"Пользователь {username} уже зарегистрирован."
else:
return redirect(url_for("auth.login"))
flash(error)
return render_template('auth/register.html')
Реализуйте представление входа
Далее мы реализуем представление входа в flaskr/auth.py. Это представление будет обрабатывать функциональность входа пользователя.
## flaskr/auth.py
@bp.route('/login', methods=('GET', 'POST'))
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
error = None
user = db.execute(
'SELECT * FROM user WHERE username =?', (username,)
).fetchone()
if user is None:
error = 'Неверное имя пользователя.'
elif not check_password_hash(user['password'], password):
error = 'Неверный пароль.'
if error is None:
session.clear()
session['user_id'] = user['id']
return redirect(url_for('index'))
flash(error)
return render_template('auth/login.html')
Реализуйте представление выхода
Теперь давайте добавим представление выхода в flaskr/auth.py. Это представление будет обрабатывать функциональность выхода пользователя.
## flaskr/auth.py
@bp.route('/logout')
def logout():
session.clear()
return redirect(url_for('index'))
Реализуйте декоратор требующий аутентификации
Нам также понадобится декоратор для защиты наших представлений, которые требуют аутентификации пользователя. Этот декоратор будет реализован в flaskr/auth.py.
## flaskr/auth.py
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if g.user is None:
return redirect(url_for('auth.login'))
return view(**kwargs)
return wrapped_view
Резюме
В этом практическом занятии мы научились использовать блюпринты Flask для структурирования нашего приложения. Мы создали блюпринт для аутентификации пользователей и реализовали представления регистрации, входа и выхода. Также мы реализовали декоратор для защиты представлений, требующих аутентификации пользователя. С этими знаниями вы теперь можете структурировать свои приложения Flask в модульном и масштабируемом стиле.