url_for中的Python flask数组查询字符串

时间:2015-04-26 23:16:47

标签: python flask

我无法找到有关使用数组查询字符串生成网址的任何信息,如下所示: http://www.domain.com?page[limit]=20&page[offset]=0

我试过了:

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

但它生成了以下网址:

  

http://www.domain.com?page= {'限制':0,'抵消':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)

它将返回以下网址:

  

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

1 个答案:

答案 0 :(得分:3)

我不相信你正在尝试的东西是开箱即用的。引擎盖url_for依赖于Werkzeug's URL routing converters来生成和编码这些值,并且它们似乎不是字典的编码器(小一点,那就是{key: value}语法表示,它不是一个数组)。

如果您想自己添加支持,我发现this blurb概述了自定义转换器的实现。如果你走这条路线,Flask项目甚至可能很乐意获得PR,但除非你需要使用page[limit]而不是page_limit,否则我只会更改它们。

url_for(endpoint, page_offset = 0, page_limit=0, _external=True)
相关问题