gpt4 book ai didi

python - 是否可以将 Flask 中的 "app factory"模式用于 Click CLI 应用程序?

转载 作者:太空狗 更新时间:2023-10-29 21:52:37 25 4
gpt4 key购买 nike

想象一下,我有一个包含许多不同命令的大型 CLI 应用程序(想想,例如 image-magick)。

我想将这个应用程序组织成模块等。所以,某处会有一个主控click.group:

#main.py file
@click.group()
def my_app():
pass

if __name__ == "__main__":
my_app()

可以在定义命令的每个模块中导入:

from main import my_app

# command_x.py
@my_app.command()
def command_x():
pass

问题是我遇到了循环导入问题,因为 main.py 文件对 command_x.py 一无所知,我必须在调用之前导入它主要部分。

这也发生在 Flask 中,通常由应用工厂模式处理。通常你会在 View 之前创建应用程序:

app = Flask("my_app")

@my_app.route("/")
def view_x():
pass

if __name__ == "__main__":
app.run()

在应用工厂模式中,您推迟蓝图的“注册”:

# blueprints.py
blueprint = Blueprint(yaddayadda)

@blueprint.route("/")
def view_x():
pass

并创建一个知道如何构建应用程序和注册蓝图的工厂:

#app_factory.py
from blueprints import view_x

def create_app():
app = Flask()
view_x.init_app(app)
return app

然后您可以创建一个脚本来运行应用程序:

#main.py

from app_factory import create_app

if __name__ == "__main__":
app = create_app()
app.run()

Click 可以使用类似的模式吗?我可以只创建一个“点击应用程序”(可能扩展 click.Group),我可以在其中注册“ Controller ”,这是单独的命令吗?

最佳答案

也许晚了,但我也在寻找将命令放入单独模块的解决方案。只需使用装饰器从模块注入(inject)命令:

#main.py file
import click
import commands

def lazyloader(f):
# f is an instance of click.Group
f.add_command(commands.my_command)
return f

@lazyloader
@click.group()
def my_app():
pass

if __name__ == "__main__":
my_app()

分离的命令可以使用来自 click 的常用装饰器。

#commands.py
import click

@click.command()
def my_command():
pass

关于python - 是否可以将 Flask 中的 "app factory"模式用于 Click CLI 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29631450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com