2015-07-01 2 views
1

Я хочу указать произвольное количество аргументов для маршрута в виде пути: /arg/arg2/arg3/etc. Я не могу понять, как поймать все эти «подпуты» по маршруту в одной функции. Как я могу сделать эту работу?Правило маршрута колбы как функция args

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 ->say:()
  • /test/say/ ->say:()
  • /test/say/hello ->say: ("hello",)
  • /test/say/hello/to/you ->say: ("hello", "to", "you")
+0

Не совсем то, что вы после этого, но есть пример написания конвертера пользовательской URL здесь (https://exploreflask.com/views. html # url-converters), которые, вероятно, могут быть адаптированы к чему-то, что сработает для вас. – hoyland

+0

@ давидизм, принятый ответ, решает проблему, но это будет означать серьезный пересмотр его удаления половины и перезаписи другой части. Проведение себя в этом случае не будет честным, так как принятый ответ дал ключ к решению – deinonychusaur

ответ

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. Вот почему мы разделили его.

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)