Представьте себе простую структуру веб-приложения Flask, которая выглядит следующим образом:
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
Хотя это нормально для небольших приложений, но для больших приложений рекомендуется использовать пакет Python вместо модуля.
Чтобы преобразовать это приложение-модуль в более крупный веб-проект на Flask, необходимо создать новую папку для приложения, внутри существующей и все переместить в неё. Затем переименовать файл yourapplication.py
в __init__.py
. Обязательно сначала удалите все файлы .pyc
, иначе все сломается.
Должно получиться что-то вроде этого:
/yourapplication
/yourapplication
__init__.py
/static
style.css
/templates
layout.html
index.html
login.html
...
Как теперь запустить приложение? Если запустить python3 yourapplication/__init__.py
, то работать ничего не будет. Скажем так, Python не хочет, чтобы модули пакета запускались как обычные Python файлы. Но это не проблема, просто добавим новый файл с именем setup.py
рядом с внутренней папкой приложения со следующим содержимым:
from setuptools import setup
setup(
name='yourapplication',
packages=['yourapplication'],
include_package_data=True,
install_requires=[
'flask',
],
)
Теперь, что-бы запустить приложение, нужно экспортировать переменную среды, которая сообщит Flask, где найти экземпляр приложения:
# bash Linux
$ export FLASK_APP=yourapplication
# CMD Windows
> set FLASK_APP=yourapplication
Если вы находитесь за пределами каталога проекта, убедитесь, что указали точный путь к каталогу запускаемого приложения. Точно так же можно включить функции разработки:
# bash Linux
$ export FLASK_ENV=development
# CMD Windows
> set FLASK_ENV=development
Чтобы установить и запустить приложение, необходимо выполнить следующие команды:
$ pip install -e .
$ flask run
Что мы от этого выиграли? Теперь можно реструктурировать приложение на несколько модулей. Единственное, что надо запомнить, это следующий контрольный список:
__init__.py
. Таким образом, каждый модуль может безопасно импортировать его, а переменная __name__
будет преобразована в правильный пакет.@app.route()
наверху) должны быть импортированы в файл __init__.py
. Не сам объект функции, а модуль, в котором они находятся. Модуль с функциями-представлениями импортируется после создания объекта приложения app
.Пример __init__.py
:
from flask import Flask
app = Flask(__name__)
from yourapplication import 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
, а просто обеспечиваем импорт модуля и делает это в нижней части файла.
С таким подходом все еще есть некоторые проблемы, но использовать декораторы @app.route()
в качестве маршрутизации, то их нет.
blueprint
.Если пишите еще более крупные приложения, то рекомендуется разделить их на более мелкие группа, где каждая группа реализуется с помощью схемы blueprint
. Для введения в эту тему обратитесь к разделу "Модульные приложения на схемах blueprint
во Flask".