Вершина массива Python в url_for

Я не могу найти какую-либо информацию о генерации URL-адреса, используя такие запросы:

Я попробовал это:

url_for(endpoint, page={'limit': 0, 'offset': 0}, _external=True) 

Но он создал следующий URL:

http://www.domain.com?page= {'limit': 0, 'offset': 0}

Мое текущее решение выглядит следующим образом:

 querystrings = [] querystrings.append('page[limit]=%d' % (limit)) querystrings.append('page[offset]=%d' % (offset)) url = '%s?%s' % (root_url, '&'.join(querystrings)) 

Я действительно надеюсь, что есть лучший способ!

Любая помощь будет оценена!


редактировать

Я закончил создание обертки, которая обрабатывает dicts отдельно, основываясь на моем предыдущем решении:

 from flask import g, url_for as _url_for def url_for(endpoint, **values): # fix querystring dicts querystring_dicts = [] for key, value in list(values.items()): if isinstance(value, dict): for _key, _value in list(value.items()): querystring_dicts.append('%s[%s]=%s' % (key, _key, _value)) values.pop(key) # create url url = _url_for(endpoint, **values) # append querystring dicts if querystring_dicts: seperator = '?' if '?' in url: seperator = '&' url = '%s%s%s' % (url, seperator, '&'.join(querystring_dicts)) return url 

Затем я вызываю обертку следующим образом:

 url_for(endpoint, page={'limit': 20, 'offset': 0}, _external=True) 

И он вернет следующий URL:

http://www.domain.com?page[limit]=20&page[offset]=0

Я не считаю, что то, что вы пытаетесь, поддерживается из коробки. Под капотом url_for полагается на конвертеры URL-адреса Werkzeug, чтобы генерировать и кодировать эти значения, и, похоже, не существует кодировщика для словарей (незначительное в сторону, это то, что обозначает синтаксис {key: value} , это не массив) ,

Я нашел этот рекламный блок, который описывает реализацию пользовательских конвертеров, если вы хотите добавить поддержку самостоятельно. Проект Flask может быть даже рад получить PR, если вы идете по этому маршруту, однако, если вам не нужно использовать page[limit] а не page_limit я бы просто изменил их.

 url_for(endpoint, page_offset = 0, page_limit=0, _external=True)