Spec-Zone.ru › Flask 2.3

Фабрики приложений

Если вы уже используете пакеты и чертежи для своего приложения (Модульные приложения с чертежами), есть несколько отличных способов дальнейшего улучшения опыта. Общим шаблоном является создание объекта приложения при импорте чертежа. Но если вы перенесёте создание этого объекта в функцию, вы сможете затем создать несколько экземпляров этого приложения позже.

Так зачем вам это нужно?

  1. Тестирование. Вы можете иметь экземпляры приложения с различными настройками для тестирования каждого случая.
  2. Несколько экземпляров. Представьте, что вы хотите запустить разные версии одного и того же приложения. Конечно, вы можете иметь несколько экземпляров с различными конфигурациями, настроенными в вашем веб-сервере, но если вы используете фабрики, вы можете иметь несколько экземпляров одного и того же приложения, работающих в одном процессе приложения, что может быть удобно.

Так как же это реализовать на практике?

Базовые фабрики

Идея заключается в настройке приложения в функции. Вот так:

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)

    from yourapplication.model import db
    db.init_app(app)

    from yourapplication.views.admin import admin
    from yourapplication.views.frontend import frontend
    app.register_blueprint(admin)
    app.register_blueprint(frontend)

    return app

Недостатки заключаются в том, что вы не можете использовать объект приложения в чертежах во время импорта. Однако вы можете использовать его внутри запроса. Как получить доступ к приложению с конфигурацией? Используйте current_app:

from flask import current_app, Blueprint, render_template
admin = Blueprint('admin', __name__, url_prefix='/admin')

@admin.route('/')
def index():
    return render_template(current_app.config['INDEX_TEMPLATE'])

Здесь мы ищем имя шаблона в конфигурации.

Фабрики и расширения

Желательно создавать свои расширения и фабрики приложений таким образом, чтобы объект расширения изначально не связывался с приложением.

Используя Flask-SQLAlchemy, например, не следует делать следующее:

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)

    db = SQLAlchemy(app)

Но, скорее, в model.py (или аналогичном):

db = SQLAlchemy()

и в вашем application.py (или аналогичном):

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)

    from yourapplication.model import db
    db.init_app(app)

Используя этот шаблон проектирования, никакие состояния, специфичные для приложения, не хранятся в объекте расширения, поэтому один объект расширения может использоваться для нескольких приложений. Более подробную информацию о проектировании расширений см. в Разработка расширений Flask.

Использование приложений

Для запуска такого приложения можно использовать команду flask:

$ flask --app hello run

Flask автоматически обнаружит фабрику, если она называется create_app или make_app в hello. Вы также можете передать аргументы в фабрику следующим образом:

$ flask --app hello:create_app(local_auth=True) run

Затем фабрика create_app в myapp вызывается с ключевым аргументом local_auth=True. Более подробную информацию см. в Интерфейс командной строки.

Улучшения фабрики

Функция фабрики выше не очень умная, но вы можете её улучшить. Следующие изменения легко реализовать:

  1. Сделать возможным передачу значений конфигурации для модульных тестов, чтобы вам не приходилось создавать файлы конфигурации на файловой системе.
  2. Вызвать функцию из чертежа, когда приложение настраивается, чтобы у вас было место для изменения атрибутов приложения (например, подключение обработчиков запросов до/после).
  3. Добавить WSGI-средства по умолчанию, если необходимо, при создании приложения.

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

Spec-Zone.ru

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