Wie erstelle ich benutzerdefinierte Flask-CLI-Befehle mit 2 oder mehr Argumenten?

Aug 15 2020

Ich möchte einen benutzerdefinierten Flask-CLI-Befehl erstellen. Es funktioniert gut, wenn ich nur mit 1 Argument verwende, aber es funktioniert nicht für 2 oder mehr Argumente. Ich verwende den folgenden Code und er schlägt bei 2 oder mehr Argumenten fehl:

# Usage: flask power 2 3 
# Output: 6
@app.cli.command()
@click.argument('x','y')
def power(x, y):
  print(int(x)**int(y))

Der folgende Code funktioniert gut mit nur 1 Parameter

# Usage: flask power 2
# Output: 6
@app.cli.command()
@click.argument('x')
def power(x):
  print(int(x)**3)

Der mit 2 oder mehr Argumenten reproduzierte Fehlercode lautet:

flask power 2 3
Traceback (most recent call last):
  File "/home/user/.local/bin/flask", line 8, in <module>
    sys.exit(main())
  File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 894, in main
    cli.main(args=args, prog_name=name)
  File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 557, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1254, in invoke
    cmd_name, cmd, args = self.resolve_command(ctx, args)
  File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1297, in resolve_command
    cmd = self.get_command(ctx, cmd_name)
  File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 515, in get_command
    rv = info.load_app().cli.get_command(ctx, name)
  File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 372, in load_app
    app = locate_app(self, import_name, name)
  File "/home/user/.local/lib/python3.5/site-packages/flask/cli.py", line 235, in locate_app
    __import__(module_name)
  File "/projects/challenge/myflaskproj/__init__.py", line 6, in <module>
    from myflaskproj.commands import power, repeat
  File "/projects/challenge/myflaskproj/commands.py", line 6, in <module>
    @click.argument('x','y')
  File "/home/user/.local/lib/python3.5/site-packages/click/decorators.py", line 168, in decorator
    _param_memo(f, ArgumentClass(param_decls, **attrs))
  File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1984, in __init__
    Parameter.__init__(self, param_decls, required=required, **attrs)
  File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 1483, in __init__
    param_decls or (), expose_value
  File "/home/user/.local/lib/python3.5/site-packages/click/core.py", line 2019, in _parse_decls
    " {}".format(len(decls))
TypeError: Arguments take exactly one parameter declaration, got 2

Wie mache ich den Befehl, 2 Argumente in dieser Methode zu akzeptieren? Mache ich irgendwo einen Fehler? Hilfe wäre sehr willkommen.

Ich habe einige Lösungen gesehen, die BluePrint verwenden, und ich möchte Blueprint nicht verwenden, um meinen Job auszuführen! Der obige Code ist einfach und bequem zu verwenden. Ich konnte nicht herausfinden, wo und was ich falsch mache!! Die zusätzliche Hilfe wird sehr geschätzt!!

Antworten

2 KusalHettiarachchi Aug 15 2020 at 22:07

@click.argumentsakzeptiert auf diese Weise nicht mehrere Parameter.

Verwenden Sie stattdessen

@app.cli.command()
@click.argument('x', nargs=1)
@click.argument('y', nargs=1)
def power(x, y):
    print(int(x)**int(y))

Sehen Sie sich die Dokumentation hier an .