Большие приложения в виде пакетов

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

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

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

Установите ваше приложение так, чтобы его можно было импортировать:

$ pip install -e .

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

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

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

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

Вернуться на верх