Приложения большого размера как пакеты
Представьте себе простую структуру приложения 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 FLASK_APP=yourapplication
> $env:FLASK_APP = "yourapplication"
Если вы находитесь вне каталога проекта, укажите полный путь к каталогу приложения. Аналогично, вы можете включить функции разработки таким образом:
$ export 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–2021 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.0.x/patterns/packages/