Сообщить об ошибке.

Пример структуры приложения Flask как пакета Python.

Создание больших веб-приложений на Flask.

Представьте себе простую структуру веб-приложения 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

Что мы от этого выиграли? Теперь можно реструктурировать приложение на несколько модулей. Единственное, что надо запомнить, это следующий контрольный список:

  • Создание объекта приложения Flask должно быть в файле __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".