Приложения большого размера как пакеты
Представьте себе простую структуру приложения 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 = ["flit_core<4"]
build-backend = "flit_core.buildapi"
Установите ваше приложение, чтобы его можно было импортировать:
$ 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 и просто гарантируем, что модуль импортирован, и мы делаем это в конце файла.
Работа с Blueprints
Если у вас есть более крупные приложения, рекомендуется разделить их на более мелкие группы, где каждая группа реализуется с помощью Blueprint. Для ознакомления с этой темой обратитесь к главе Модульные приложения с Blueprints документации.
© 2010 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/stable/patterns/packages/