- en
- Language: ru
- Documentation version: 1.1.x
Крупные приложения¶
Представьте себе простую структуру приложения flask, которая выглядит следующим образом:
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
Хотя это нормально для небольших приложений, для больших приложений хорошей идеей будет использование пакета вместо модуля. tutorial структурирован для использования паттерна пакета, см. example code.
Простые пакеты¶
Чтобы преобразовать ее в более крупную, просто создайте новую папку 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 application object creation has to be in the
__init__.py
file. That way each module can import it safely and the __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
, а просто убеждаемся, что модуль импортирован, и делаем это в нижней части файла.
С этим подходом все еще есть некоторые проблемы, но если вы хотите использовать декораторы, это невозможно обойти. Посмотрите раздел Стать большим, чтобы узнать, как с этим справиться.
Работа с чертежами¶
Если у вас большие приложения, рекомендуется разделить их на более мелкие группы, где каждая группа реализуется с помощью чертежа. Для легкого введения в эту тему обратитесь к главе Модульные приложения с чертежами документации.