Приложения большего размера
Представьте структуру простого приложения 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
Если вы находитесь вне каталога проекта, убедитесь, что указали точный путь к каталогу вашего приложения. Аналогично, вы можете включить функции разработки так:
export 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 и просто гарантируем импорт модуля, и мы делаем это в нижней части файла.
Все еще существуют некоторые проблемы с этим подходом, но если вы хотите использовать декораторы, другого пути нет. Ознакомьтесь с разделом Becoming Big для получения вдохновения, как с этим справиться.
Работа с Blueprints
Для более крупных приложений рекомендуется разделить их на более мелкие группы, реализуемые с помощью blueprint. Для ознакомления с этой темой обратитесь к главе Модульные приложения с Blueprints документации.
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/1.0.x/patterns/packages/