Подтвердить что ты не робот

Структура фляжных приложений

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

Я хочу, чтобы мое приложение было разделено между различными модулями, но трудно получить доступ к основному объекту app (или db from flask-sqlalchemy) из любого другого места, кроме основного модуля. Похоже, вы должны действительно написать свой собственный способ рассматривать его как глобальный, к которому все имеет доступ, что требует некоторого сомнительного кода и немного времени.

Оба app и db создаются на уровне, где создается основное приложение, и в каждом примере предполагается, что они доступны на верхнем уровне. Но если я разделяю разные обработчики URL-адресов на разные модули, я теряю способность использовать @app.route decorator. Я могу обойти это с помощью app.add_url_rule('/...', some.module...), но опять же приложение не будет передано этой функции.

То же самое происходит с db - я не знаю, должен ли я вставлять его в g или сделать его доступным через app каким-то образом. Это не помогает мне перемещать модели в отдельный модуль - как я могу получить доступ к db при импорте? Все примеры снова предполагают, что он доступен только как локальная переменная.

Я пропустил что-то очевидное, или я пытаюсь использовать колбу для неправильной задачи здесь?

4b9b3361

Ответ 1

Ответ на ваш вопрос - это чертежи. Фактически, если вы посмотрите на документацию, то упоминается, что чертежи там, чтобы включить разделение приложения в модулях.

Пример кода:

    from flask import Blueprint

    mod = Blueprint(blueprint_name, __name__, template_folder="folder_name"
                    static_folder="folder_name")

    @mod.route('/mymodule')
    def view():
         # your code

В app.py

    from yourmodule import mod 

    app.register_blueprint(mod)

Это правильный способ разделить приложение на модули. Ознакомьтесь с документами для более подробной информации.

Кроме того, если вам требуется доступ к приложению в любом другом модуле, вы должны использовать current_app прокси приложения.

    from flask import current_app

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

Ответ 2

Вы видели новую blueprints функцию (я еще не использовал ее, но похоже, что это может быть полезно в вашем случае).