Geo*_*iuc 2 python click flask flask-cli
我想注册一个在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
Run Code Online (Sandbox Code Playgroud)
instance/config.py
TEST_VARIABLE = "TESTVALUE"
Run Code Online (Sandbox Code Playgroud)
app/commands.py
from flask import current_app
@click.command()
def my_command():
click.echo(current_app.config["TEST_VARIABLE"])
Run Code Online (Sandbox Code Playgroud)
我希望能运行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.
Run Code Online (Sandbox Code Playgroud)
我需要使用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"])
...
Run Code Online (Sandbox Code Playgroud)
但是,我想在其他文件中定义命令,并让它们使用应用程序配置中的值,而这需要将所有命令嵌套在出厂函数中。
我尝试使用命令中的工厂创建一个应用程序,并且有效,但是我认为这样做只是为了访问config变量不是一个好主意。
import click
import app
@click.command()
def my_command():
app_config = app.create_app().config
click.echo(app_config["TEST_VARIABLE"])
Run Code Online (Sandbox Code Playgroud)
使用应用程序工厂模式时,如何定义可以访问应用程序上下文的命令?
@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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2961 次 |
| 最近记录: |