Làm thế nào để tạo các lệnh Flask CLI tùy chỉnh với 2 đối số trở lên?

Aug 15 2020

Tôi muốn tạo một lệnh Flask CLI tùy chỉnh. Nó hoạt động tốt khi tôi chỉ sử dụng với 1 đối số nhưng nó không hoạt động với 2 hoặc nhiều đối số. Tôi đang sử dụng mã dưới đây và nó không thành công với 2 đối số trở lên:

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

Đoạn mã sau hoạt động tốt chỉ với 1 tham số

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

Lỗi được tạo lại với 2 mã đối số trở lên là:

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

Làm cách nào để thực hiện lệnh chấp nhận 2 đối số trong phương thức này? Tôi có đang làm sai ở đâu đó không? Giúp đỡ sẽ được đánh giá cao.

Tôi đã thấy một số giải pháp sử dụng BluePrint và tôi không muốn sử dụng Blueprint để thực hiện công việc của mình! Đoạn mã trên rất đơn giản và thuận tiện để sử dụng. Tôi không thể tìm ra nơi và những gì tôi đang làm sai !! Sự trợ giúp thêm được đánh giá cao !!

Trả lời

2 KusalHettiarachchi Aug 15 2020 at 22:07

@click.arguments không chấp nhận nhiều tham số theo cách này.

Thay vào đó, hãy sử dụng

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

Tham khảo tài liệu tại đây .