Приложения большой сложности как пакеты
Представьте себе простую структуру приложения 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 не хочет, чтобы модули в пакетах были файлом запуска. Но это не большая проблема, просто добавьте новый файл, названный setup.py рядом с внутренней папкой yourapplication со следующим содержимым:
from setuptools import setup
setup(
name='yourapplication',
packages=['yourapplication'],
include_package_data=True,
install_requires=[
'flask',
],
)
Для запуска приложения необходимо экспортировать переменную среды, которая указывает Flask, где найти экземпляр приложения:
$ export FLASK_APP=yourapplication
$ set -x FLASK_APP yourapplication
> set FLASK_APP=yourapplication
> $env:FLASK_APP = "yourapplication"
Если вы находитесь вне каталога проекта, убедитесь, что указан точный путь к каталогу вашего приложения. Аналогично, можно включить функции разработки, как это:
$ export FLASK_ENV=development
$ set -x FLASK_ENV development
> set FLASK_ENV=development
> $env:FLASK_ENV = "development"
Для установки и запуска приложения необходимо выполнить следующие команды:
$ pip install -e . $ flask 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
setup.py
/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 документации.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.1.x/patterns/packages/