Большие приложения в виде пакетов¶
Представьте себе простую структуру приложения flask, которая выглядит следующим образом:
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
Хотя это нормально для небольших приложений, для больших приложений хорошей идеей будет использование пакета вместо модуля. Учебник структурирован для использования паттерна пакета, см. 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',
],
)
Установите ваше приложение так, чтобы его можно было импортировать:
$ pip install -e .
Чтобы использовать команду flask
и запустить ваше приложение, необходимо установить параметр --app
, который указывает Flask, где найти экземпляр приложения:
$ flask --app yourapplication 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
, а просто убеждаемся, что модуль импортирован, и делаем это в нижней части файла.
Работа с чертежами¶
Если у вас большие приложения, рекомендуется разделить их на более мелкие группы, где каждая группа реализуется с помощью чертежа. Для легкого введения в эту тему обратитесь к главе Модульные приложения с чертежами документации.