Spec-Zone.ru › Flask 2.1

Приложения большой сложности как пакеты

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

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

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

Простые пакеты

Чтобы преобразовать его в более крупный, просто создайте новую папку 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
$ set -x FLASK_APP yourapplication
> set FLASK_APP=yourapplication
> $env:FLASK_APP = "yourapplication"

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

$ export FLASK_ENV=development
$ set -x FLASK_ENV development
> set FLASK_ENV=development
> $env:FLASK_ENV = "development"

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

$ pip install -e .
$ flask run

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

  1. Создание объекта приложения Flask должно выполняться в файле __init__.py. Таким образом, каждый модуль может безопасно его импортировать, и переменная __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 и просто гарантируем, что модуль импортирован, и делаем это в конце файла.

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

Работа с Blueprints

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

© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.1.x/patterns/packages/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API