在 CLI 命令中访问 Flask 应用上下文
Access Flask app context in CLI command
我想注册一个在 Flask 应用程序工厂的单独文件中定义的 CLI 命令。此命令需要访问 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.
我需要为 current_app
使用 with app.app_context():
才能工作,但我无权访问 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's docs about the CLI discuss this.
@app.cli.command()
自动确保命令运行时存在应用上下文。但是,这在使用应用工厂时不太方便,因为您在定义命令时无法访问应用。
使用app factory时,使用@click.command()
和app.cli.add_command()
分开定义和注册命令,但是@click.command
不知道app context。使用 @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
我想注册一个在 Flask 应用程序工厂的单独文件中定义的 CLI 命令。此命令需要访问 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.
我需要为 current_app
使用 with app.app_context():
才能工作,但我无权访问 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's docs about the CLI discuss this.
@app.cli.command()
自动确保命令运行时存在应用上下文。但是,这在使用应用工厂时不太方便,因为您在定义命令时无法访问应用。
使用app factory时,使用@click.command()
和app.cli.add_command()
分开定义和注册命令,但是@click.command
不知道app context。使用 @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