Доступ к контексту приложения Flask в команде CLI

1

Я хочу зарегистрировать команду CLI, определенную в отдельном файле с фабрики приложений Flask. Эта команда нуждается в доступе к app.config. Однако доступ к current_app.config из команды вызывает RuntimeError: Working outside of application context.

app/__init__.py

from flask import Flask
from app.commands import my_command

def create_app():
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_pyfile("config.py")
    app.add_command(my_command)
    return app

instance/config.py

TEST_VARIABLE = "TESTVALUE"

app/commands.py

from flask import current_app

@click.command()
def my_command():
    click.echo(current_app.config["TEST_VARIABLE"])

Я ожидаю, что текущая TESTVALUE flask my_command будет выводить TESTVALUE. Однако я получаю следующую ошибку:

RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information.

Мне нужно использовать with app.app_context(): для работы current_app, но у меня нет доступа к app поскольку он определен на заводе. Если я использую @app.cli.command() на заводе, это не будет проблемой, так как там у меня есть доступ к переменной app, и даже не нужно будет указывать контекст приложения.

def create_app():
    ...
    @app.cli.command()
    def my_command():
        click.echo(current_app.config["TEST_VARIABLE"])
    ...

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

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

import click
import app

@click.command()
def my_command():
    app_config = app.create_app().config
    click.echo(app_config["TEST_VARIABLE"])

Как определить команду, которая имеет доступ к контексту приложения при использовании шаблона фабрики приложений?

Теги:
flask
click
flask-cli

1 ответ

1
Лучший ответ

Об этом говорят в флягах документы об CLI.

@app.cli.command() автоматически обеспечивает наличие контекста приложения при @app.cli.command() команды. Однако это менее удобно использовать при использовании фабрики приложений, потому что у вас нет доступа к приложению при определении команды.

При использовании фабрики приложений вы используете @click.command() и app.cli.add_command() для разделения определения и регистрации команды, но @click.command не знает о контексте приложения. Используйте @with_appcontext decorator, чтобы обеспечить выполнение команды в контексте приложения.

@click.command()
@with_appcontext
def my_command():
    config = current_app.config
    click.echo(config["TEST_VARIABLE"])

def create_app():
    app = Flask(__name__)
    ...
    app.cli.add_command(my_command)
    ...
    return app
$ flask my_command
TESTVALUE

Ещё вопросы

Сообщество Overcoder
Наверх
Меню