2015-08-26 3 views
3

У меня есть шаблон jinja2, который я использую для разных маршрутов Flask. Все эти маршруты имеют единственный требуемый параметр и обрабатывают только GET запросов, но некоторые маршруты могут иметь дополнительные аргументы.Создайте динамические аргументы для url_for в Flask

Есть ли способ добавить дополнительные аргументы на url_for()?


Что-то вроде

url_for(my_custom_url, oid=oid, args=extra_args) 

, который будет оказывать (в зависимости от маршрута конечной точки):

# route 'doit/<oid>' with arguments 
doit/123?name=bob&age=45 

# route 'other/<oid>' without arguments 
other/123 

Мой случай использования будет содержать ссылки с заданными аргументами запроса:

<a href=" {{ url_for('doit', oid=oid, args=extra_args }} ">A specific query</a> 
<a href=" {{ url_for('other', oid=oid) }} ">A generic query</a> 

Я бы хотел ke для запуска этого шаблона без JavaScript, поэтому я бы не хотел назначать прослушиватель кликов и использовать AJAX для запроса GET для каждой ссылки, если это возможно.

ответ

2

Любые аргументы, которые не соответствуют параметрам маршрута, будут добавлены в качестве строки запроса. Предполагая, что extra_args - это диктофон, просто распакуйте его.

extra_args = {'hello': 'world'} 
url_for('doit', oid=oid, **extra_args) 
# /doit/123?hello=world 
url_for('doit', oid=oid, hello='davidism') 
# /doit/123?hello=davidism 

Доступ их в представлении с request.args:

@app.route('/doit/<int:oid>') 
def doit(oid) 
    hello = request.args.get('hello') 
    ... 
-1

Используя ваш пример, эта рана генерировать URL, как вы просили, если вы знаете, ваши аргументы заранее.

<a href=" {{ url_for('doit', oid=oid, name='bob', age=45 }} ">A specific query</a> 

<a href=" {{ url_for('other', oid=oid) }} ">A generic query</a> 

@ ответ davidism был бы предпочтительнее, если ваш набор аргументов не известно до времени выполнения и сохраняются в словаре.