Использование Blueprint для организации приложений Flask
Большие приложения могут стать сложными и трудноуправляемыми из-за наличия множества компонентов и замысловатых структур.
Чертежи Flask помогают организовать большие приложения на более мелкие, управляемые компоненты, что приводит к повышению удобства обслуживания приложения.
Чертежи могут содержать представления, шаблоны и статические файлы для различных компонентов, аналогичные структуре типичного приложения Flask. Эти чертежи можно зарегистрировать в приложении Flask, чтобы интегрировать их в приложение.
Структура приложения Flask
Если вы уже использовали фреймворк Flask, вы можете структурировать свое приложение Flask следующим образом:
.
├── app.py
├── static/
└── templates/
└── index.html
После того как вы создали структуру приложения, добавьте код в файл app.py
.
# app.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def home():
return render_template("index.html")
В небольших проектах определение представлений в главном файле может не представлять особой проблемы. Однако в более сложных проектах, когда необходимо создавать маршруты для различных компонентов, таких как управление пользователями, функции администратора, профили, голосования и т. д., организация этих маршрутов в одном файле может стать сложной задачей. Это может привести к плохой сопровождаемости кода и усложнить управление проектом.
Именно в этом случае чертежи оказываются очень полезными, поскольку они позволяют структурировать приложение на более мелкие компоненты, что повышает удобство работы.
Создание Blueprint
Добавьте следующий код в новый файл Python на корневом уровне, blueprint.py
.
# blueprint.py
from flask import Blueprint
bp = Blueprint("blueprint", __name__)
@bp.route("/")
def home():
return "<h1>Hello</h1>"
@bp.route("/user")
def user_info():
return "<h1>User Info</h1>"
Код импортирует класс Blueprint
из flask
, который поможет в определении маршрутов.
Экземпляр Blueprint
создается вызовом Blueprint("blueprint", __name__)
с передачей двух аргументов, первый из которых, "blueprint"
, - имя Blueprint, а второй, __name__
, - имя импорта Blueprint. После этого экземпляр сохраняется в переменной bp
.
Маршруты определяются с помощью экземпляра Blueprint (bp
) аналогично тому, как маршруты определяются с помощью экземпляра приложения Flask (app
).
Декораторы @bp.route()
используются для связывания URL-маршрутов с функциями представления, определенными в чертеже. Функция home()
связана с корневым URL ("/"
), а функция user_info()
- с URL "/user"
.
Регистрация Blueprint
Blueprint похож на приложение Flask, но это не приложение, напротив, blueprint должен быть зарегистрирован в приложении Flask, чтобы расширить его функциональность.
Перейдите в основное приложение Flask, созданное в Python-файле app.py
, и зарегистрируйте созданный выше blueprint.
# app.py
from flask import Flask
from blueprint import bp
# Flask app instance
app = Flask(__name__)
app.register_blueprint(bp)
if __name__ == "__main__":
app.run(debug=True)
Код импортирует экземпляр Blueprint, bp
, из модуля blueprint
(blueprint.py
), и этот импорт включает в себя все маршруты и представления Blueprint.
Метод register_blueprint()
используется для регистрации экземпляра blueprint (bp
) в экземпляре приложения Flask (app
).
Если вы запустите приложение, то сможете получить доступ к маршрутам, определенным в blueprint.
Монтаж блюпринтов в разных аспектах
Блюпринты могут быть привязаны к определенному URL-пути, который может быть префиксом для всех маршрутов, определенных в блюпринте.
Это можно сделать, используя параметр url_prefix
при регистрации блюпринта с помощью метода register_blueprint()
в приложении Flask.
# app.py
from flask import Flask
from blueprint import bp
# Flask app instance
app = Flask(__name__)
app.register_blueprint(bp, url_prefix="/demo")
if __name__ == "__main__":
app.run(debug=True)
Префикс url_prefix
теперь равен "/demo"
. Это означает, что к маршрутам в чертеже ("/"
и "/user"
) можно получить доступ, добавив "/demo"
в начало их URL-путей.
Полный URL-адрес маршрута ("/"
) изменяется на "/demo/"
для функции home()
. Также полный URL-адрес маршрута "/user"
теперь будет "/demo/user"
для функции user_info()
.
Вы можете задать url_prefix
при создании экземпляра Blueprint. Класс Blueprint предлагает параметр url_prefix
, и в приведенном примере кода демонстрируется его использование.
# blueprint.py
from flask import Blueprint
bp = Blueprint("blueprint", __name__, url_prefix="/sample")
URL-путь для маршрута ("/"
) станет "/sample/"
. Аналогично, путь URL для маршрута "/user"
изменится на "/sample/user"
.
Примечание: Если вы задали параметр url_prefix
внутри blueprint, не задавайте его снова во время регистрации blueprint. Это приведет к перезаписи URL-префикса блюпринта.
Предупреждение: Если вы зададите url_prefix
в блюпринте, а затем зададите его снова при регистрации блюпринта в приложении, то последний параметр будет перезаписан первым.
Шаблоны и статичные папки
У вас есть несколько вариантов организации приложения с помощью blueprints.
.
└── app/
├── __init__.py
├── admin/
│ ├── __init__.py
│ ├── routes.py
│ ├── static/
│ └── templates/
├── user/
│ ├── __init__.py
│ ├── routes.py
│ ├── static/
│ └── templates/
└── models.py
Если структура вашего проекта соответствует приведенному выше примеру, вам придется указать местоположение шаблонов и статических папок в Blueprint
.
Класс Blueprint
предоставляет вам параметры templates_folder
и static_folder
, которые позволяют вам определить точный путь (абсолютный или относительный) к шаблонам и статическим папкам Blueprint при создании экземпляра класса Blueprint
.
# admin/routes.py
from flask import Blueprint
admin_bp = Blueprint("admin_blueprint",
__name__,
template_folder="templates",
static_folder="static")
# user/routes.py
from flask import Blueprint
user_bp = Blueprint("user_blueprint",
__name__,
template_folder="templates",
static_folder="static")
Оба чертежа "admin_bp"
и "user_bp"
имеют собственные каталоги для шаблонов и статичных файлов. Такое разделение гарантирует, что соответствующие шаблоны и активы хранятся отдельно от других частей приложения, поддерживая изоляцию и организацию.
Избегайте столкновения имён шаблонов
Когда вы разрабатываете чертежи для различных частей приложения, расположение проекта имеет большое значение. Например, если обратиться к вышеупомянутому макету, то дублирование имен HTML-файлов в директориях admin/templates
и user/templates
может привести к путанице в именах.
Приложение Flask ищет шаблоны в каталоге "templates"
. Если пути к файлам шаблонов дублируются в разных чертежах, то приоритет отдается тому, который был зарегистрирован в порядке регистрации чертежей. Тот, что зарегистрирован позже, будет иметь приоритет над более ранним.
Чтобы избежать возможных проблем, можно сформировать макет проекта следующим образом:
.
└── app/
├── app.py
├── models.py
├── admin/
│ ├── __init__.py
│ ├── routes.py
│ ├── static/
│ └── templates/
│ └── admin/
│ └── index.html
└── user/
├── __init__.py
├── routes.py
├── static/
└── templates/
└── user/
└── index.html
Кроме того, можно присвоить шаблонам разные имена.
Маршрутизация шаблонов с помощью Blueprints
Маршрутизация шаблонов с помощью чертежей отличается от обычного подхода. Она включает в себя особый формат, в котором имя блюпринта добавляется в качестве префикса к связанной с ним функции представления.
Например, если ваш блюпринт называется admin_blueprint
и включает функцию представления с именем home()
, то формат будет admin_blueprint.home
.
admin/templates/admin/index.html
<a href="{{ url_for('user_blueprint.home') }}">User</a>
Вышеупомянутая ссылка указывает на маршрут, связанный с функцией home()
в user_blueprint
. Функция url_for()
динамически создает URL для маршрута user_blueprint.home
.
user/templates/user/index.html
<a href="{{ url_for('admin_blueprint.home') }}">Admin</a>
Аналогичная ситуация и с ссылкой, упомянутой ранее. Она ведет к маршруту, связанному с функцией home
в admin_blueprint
. Функция url_for()
динамически генерирует URL для маршрута admin_blueprint.home
.
Включение CSS-файлов с помощью Blueprints: Создание URL-адресов для статических активов
Процедура очень похожа на ту, что вы проделывали с шаблонами. Чтобы включить или предоставить CSS-файлы в HTML-шаблон, необходимо сконструировать URL, который направляет на CSS-файл, расположенный в указанной статической папке чертежа.
Например, метод для ссылки на файл "style.css"
, находящийся в директории static
blueprint "admin_blueprint"
, будет иметь вид url_for('admin_blueprint.static', filename='style.css')
.
Примечание: Вы должны указать путь к каталогу, в котором находятся статические файлы (CSS, JavaScript, изображения и т. д.) для данного чертежа. Для этого используется параметр static_folder
.
admin/templates/admin/index.html
<link rel="stylesheet" href="{{ url_for('admin_blueprint.static', filename='style.css') }}">
В приведенном выше фрагменте HTML-кода используется функция url_for()
для генерации URL, указывающего на статический файл "style.css"
, связанный с admin_blueprint
.
Пользовательский путь URL для статических файлов
Flask Blueprint предоставляет параметр static_url_path
, который позволяет гибко определять пользовательский префикс URL для статических файлов (CSS, JavaScript, изображений и т. д.), связанных с Blueprint
.
# admin/routes.py
from flask import Blueprint
admin_bp = Blueprint("admin_blueprint",
__name__,
template_folder="templates",
static_folder='static',
static_url_path='admin')
Путь static_url_path
установлен как "admin"
, что делает статические файлы в admin_blueprint
доступными по пути URL admin/
.
Теперь вы можете напрямую включать статические файлы (CSS, JavaScript, изображения и т. д.), указывая путь к статическому URL.
Включение статических файлов с помощью статического пути URL
<link rel="stylesheet" href="admin/style.css">
<!--Body Section-->
<img src="admin/partners.png">
Полная веб-страница будет выглядеть так, как показано на рисунке ниже:
Заключение
Flask Blueprint используется в качестве расширения для приложения Flask и служит для организации больших и сложных приложений в более мелкие и управляемые компоненты.
Спасибо за прочтение! Счастливого кодинга!