Представьте себе простую структуру веб-приложения 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', ], )
Теперь перейдите в папку с приложением и запустите его командой:
$ cd yourapplication
~/yourapplication$ flask --app yourapplication run
Переменная среды
FLASK_ENV
и атрибутapp.env
устарели с версии Flask 2.2.0, что устраняет различие между режимами разработки и отладки. Режим отладки следует контролировать напрямую с помощью параметра CLI--debug
илиapp.run(debug=True)
.
Через командную строку так же можно включить функции разработки, добавив параметра --debug
:
$ cd yourapplication
~/yourapplication$ flask --app yourapplication run --debug
Чтобы установить и запустить приложение, необходимо выполнить следующие команды:
$ 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".