Большие приложения как пакеты
Представьте структуру простого приложения Flask, которая выглядит так:
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
Хотя это хорошо подходит для небольших приложений, для больших приложений лучше использовать пакет вместо модуля. Учебник построен по схеме пакета, см. пример кода.
Простые пакеты
Чтобы преобразовать его в более крупный, просто создайте новую папку yourapplication внутри существующей и переместите все содержимое в неё. Затем переименуйте yourapplication.py в __init__.py. (Убедитесь, что сначала удалили все .pyc файлы, в противном случае, скорее всего, возникнут проблемы)
В результате у вас должно получиться что-то вроде этого:
/yourapplication
/yourapplication
__init__.py
/static
style.css
/templates
layout.html
index.html
login.html
...
Но как теперь запустить ваше приложение? Примитивный python
yourapplication/__init__.py не сработает. Скажем так, Python не хочет, чтобы модули в пакетах были файлом запуска. Но это не большая проблема, просто добавьте новый файл под названием pyproject.toml рядом с внутренней папкой yourapplication со следующим содержимым:
[project]
name = "yourapplication"
dependencies = [
"flask",
]
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
Установите ваше приложение, чтобы его можно было импортировать:
$ pip install -e .
Чтобы использовать команду flask и запустить ваше приложение, необходимо установить параметр --app, который указывает Flask, где найти экземпляр приложения:
$ flask --app yourapplication run
Что мы получили? Теперь мы можем немного перестроить приложение на несколько модулей. Единственное, что нужно запомнить, — это быстрый контрольный список:
- создание объекта приложения
Flaskдолжно происходить в файле__init__.py. Таким образом, каждый модуль может безопасно импортировать его, и переменная__name__будет соответствовать правильному пакету. - все функции представления (те, которые имеют декоратор
route()сверху) должны быть импортированы в файл__init__.py. Не сам объект, а модуль, в котором он находится. Импортируйте модуль представления после создания объекта приложения.
Вот пример __init__.py:
from flask import Flask app = Flask(__name__) import yourapplication.views
И вот как будет выглядеть views.py:
from yourapplication import app
@app.route('/')
def index():
return 'Hello World!'
В результате у вас должно получиться что-то вроде этого:
/yourapplication
pyproject.toml
/yourapplication
__init__.py
views.py
/static
style.css
/templates
layout.html
index.html
login.html
...
Циклические импорты
Каждый программист Python их ненавидит, а мы только что добавили некоторые: циклические импорты (это когда два модуля зависят друг от друга. В данном случае views.py зависит от __init__.py). Имейте в виду, что это плохая идея в общем случае, но здесь она вполне приемлема. Причина в том, что мы фактически не используем представления в __init__.py и просто гарантируем импорт модуля, и мы делаем это в конце файла.
Работа с Blueprint
Если у вас большие приложения, рекомендуется разделить их на меньшие группы, где каждая группа реализуется с помощью blueprint. Для введения в эту тему обратитесь к главе документации Модульные приложения с Blueprint.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.3.x/patterns/packages/