【问题标题】:How to "resolve" a Flask cli command programmatically?如何以编程方式“解析” Flask cli 命令?
【发布时间】:2020-11-16 15:49:49
【问题描述】:

我在一个项目中有一堆custom Flask commands,根据文档添加,例如:

import click
from flask import Flask
from flask.cli import AppGroup

app = Flask(__name__)
user_cli = AppGroup('user')

@user_cli.command('create')
@click.argument('name')
def create_user(name):
    ...

app.cli.add_command(user_cli)

我还需要在子进程中运行一些命令并记录一些信息。如何在给定'flask user create demo' 之类的字符串的情况下“解析”命令并获取命令的名称不带任何参数,即在这种情况下为'flask user create'?我可以看到app.cli 有一个resolve_command() 方法,但我不知道如何使用它。

【问题讨论】:

    标签: python flask command-line command python-click


    【解决方案1】:

    我假设 Flask 的 CLI 组只是标准 click cli 组的包装。 因此,如果您想获取名称和命令路径,可以在create_user 中执行此操作:

    @user_cli.command('create')
    @click.argument('name')
    def create_user(name):
        ctx = click.get_current_context()
        print(ctx.command.name)
        print(ctx.command_path)
    

    此外,要根据名称解析命令,您可以使用Context 上可用的get_command 方法: https://click.palletsprojects.com/en/7.x/api/#click.MultiCommand.get_command

    我还添加了一个使用resolve_command 解析命令的app 命令。这可能会帮助你实现你想要的。如果您不介意我问,您想要实现的目标的用例是什么?

    @app.cli.command('resolve')
    @click.argument('name', nargs=-1)
    def resolve(name):
        group, *command = app.cli.resolve_command(click.get_current_context(), name)
        print(group)
        print(command)
    
    ❯ flask resolve user create
    user
    [<AppGroup user>, ('create',)]
    

    【讨论】:

    • 我需要在实际的命令处理程序之外进行。如何仅使用 app 实例(如在 OP 中)“解析”命令?
    • 除了我尝试过的一些非常基本的东西之外,对 Flask 并不太熟悉。您介意发布一个示例应用程序,以便我可以轻松复制设置吗?
    • 我认为您可以使用来自here 的最小应用程序,只需向其中添加一个custom command(带有一个组)。
    • 然后我做错了,因为 Flask 抱怨缺少环境变量和文件。一旦我得到它的工作,我会通知你
    • 您可能需要设置 FLASK_APP 变量,例如如果将代码放在文件hello.py 中,则运行export FLASK_APP=hello.py
    猜你喜欢
    • 2016-11-03
    • 2023-04-05
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多