Spec-Zone.ru › Flask 3.0

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

Представьте себе простую структуру приложения 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

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

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

Spec-Zone.ru

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