Доступ к контексту приложения Flask в команде CLI
Я хочу зарегистрировать команду 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"])
Я ожидаю бега 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"])
Как определить команду, которая имеет доступ к контексту приложения при использовании шаблона фабрики приложений?
1 ответ
Документы Flask о CLI обсуждают это.
@app.cli.command()
автоматически обеспечивает наличие контекста приложения при запуске команды. Однако это менее удобно использовать при использовании фабрики приложений, поскольку у вас нет доступа к приложению при определении команды.
При использовании фабрики приложений вы используете @click.command()
а также app.cli.add_command()
для разделения определения и регистрации команды, но @click.command
не знает о контексте приложения. Использовать @with_appcontext
декоратор для обеспечения выполнения команды в контексте приложения.
@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