Flask路由规则作为函数args

时间:2015-07-01 13:19:36

标签: python flask

我想以路径的形式为路径指定任意数量的参数:/arg/arg2/arg3/etc。我无法弄清楚如何在单个函数中捕获路径下的所有这些“子路径”。我怎样才能做到这一点?

from flask import Flask

app = Flask("Example")

@app.route("/test/<command>/*")
def test(command=None, *args):
    return "{0}: {1}".format(command, args)

app.run()

预期的行为是:

  • /test/say - &gt; say: ()
  • /test/say/ - &gt; say: ()
  • /test/say/hello - &gt; say: ("hello",)
  • /test/say/hello/to/you - &gt; say: ("hello", "to", "you")

2 个答案:

答案 0 :(得分:2)

我不确定你是否可以按照你想要的方式接受多个参数。

实现此目的的一种方法是定义多条路线。

@app.route('/test/<command>')
@app.route('/test/<command>/<arg1>')
@app.route('/test/<command>/<arg1>/<arg2>')
def test(command=None, arg1=None, arg2=None):
    a = [arg1, arg2]
    # Remove any args that are None
    args = [arg for arg in a if arg is not None]
    if command == "say":
        return ' '.join(args)
    else:
        return "Unknown Command"

http://127.0.0.1/test/say/hello/应该返回hello

http://127.0.0.1/test/say/hello/there应该返回hello there

另一种方法是使用path

@app.route('/test/<command>/<path:path>')
def test(command, path):
    args = path.split('/')
    return " ".join(args)

如果您使用此功能,那么如果您转到http://127.0.0.1/test/say/hello/there

然后path将设置为值hello/there。这就是我们拆分它的原因。

答案 1 :(得分:2)

完全涵盖解决方案的预期行为:

@app.route("/test/<command>") 
@app.route("/test/<command>/")
@app.route("/test/<command>/<path:args>") 
def test(command="", args=""):                                                  
    if args:
        args = tuple(args.split("/"))
    else:
        args = tuple() 

    return "{0}: {1}".format(command, args)