Spec-Zone.ru › Flask 2.3

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

Представьте структуру простого приложения 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 не хочет, чтобы модули в пакетах были файлом запуска. Но это не большая проблема, просто добавьте новый файл под названием pyproject.toml рядом с внутренней папкой yourapplication со следующим содержимым:

[project]
name = "yourapplication"
dependencies = [
    "flask",
]

[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

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

$ pip install -e .

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

$ flask --app yourapplication 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
    pyproject.toml
    /yourapplication
        __init__.py
        views.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...

Циклические импорты

Каждый программист Python их ненавидит, а мы только что добавили некоторые: циклические импорты (это когда два модуля зависят друг от друга. В данном случае views.py зависит от __init__.py). Имейте в виду, что это плохая идея в общем случае, но здесь она вполне приемлема. Причина в том, что мы фактически не используем представления в __init__.py и просто гарантируем импорт модуля, и мы делаем это в конце файла.

Работа с Blueprint

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

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

Spec-Zone.ru

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