Приложения больших размеров как пакеты
Представьте структуру приложения 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',
],
)
Установите ваше приложение, чтобы его можно было импортировать:
$ pip install -e .
Чтобы использовать команду flask и запустить приложение, необходимо установить опцию --app, которая указывает Flask, где найти экземпляр приложения:
$ flask –app yourapplication 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 и просто гарантируем, что модуль импортирован, и делаем это в конце файла.
Работа с Blueprint
Для больших приложений рекомендуется разделить их на меньшие группы, где каждая группа реализуется с помощью Blueprint. Для более подробного ознакомления с этой темой обратитесь к главе Модульные приложения с Blueprints документации.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.2.x/patterns/packages/