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