Spec-Zone.ru › Flask

Приложения большого размера как пакеты

Представьте себе простую структуру приложения 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 = ["flit_core<4"]
build-backend = "flit_core.buildapi"

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

$ 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 и просто гарантируем, что модуль импортирован, и мы делаем это в конце файла.

Работа с Blueprints

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

© 2010 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/stable/patterns/packages/

Spec-Zone.ru

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