• en
  • Language: ru
  • Documentation version: 1.1.x

Крупные приложения

Представьте себе простую структуру приложения flask, которая выглядит следующим образом:

/yourapplication
    yourapplication.py
    /static
        style.css
    /templates
        layout.html
        index.html
        login.html
        ...

Хотя это нормально для небольших приложений, для больших приложений хорошей идеей будет использование пакета вместо модуля. tutorial структурирован для использования паттерна пакета, см. 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',
    ],
)

Чтобы запустить приложение, необходимо экспортировать переменную окружения, которая указывает Flask, где найти экземпляр приложения:

$ export FLASK_APP=yourapplication

Если вы находитесь вне каталога проекта, убедитесь, что указали точный путь к каталогу вашего приложения. Аналогичным образом вы можете включить функции разработки следующим образом:

$ export FLASK_ENV=development

Для установки и запуска приложения необходимо выполнить следующие команды:

$ pip install -e .
$ flask run

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

  1. переменная Flask application object creation has to be in the __init__.py file. That way each module can import it safely and the __name__ будет разрешаться в правильный пакет.

  2. все функции представления (те, что с декоратором 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, а просто убеждаемся, что модуль импортирован, и делаем это в нижней части файла.

С этим подходом все еще есть некоторые проблемы, но если вы хотите использовать декораторы, это невозможно обойти. Посмотрите раздел Стать большим, чтобы узнать, как с этим справиться.

Работа с чертежами

Если у вас большие приложения, рекомендуется разделить их на более мелкие группы, где каждая группа реализуется с помощью чертежа. Для легкого введения в эту тему обратитесь к главе Модульные приложения с чертежами документации.