7

所以不幸的是,我发现自己需要修改现有的 Pylons 应用程序来处理提供多个同名参数的 URL。类似于以下内容... domain:port/action?c=1&v=3&c=4

通常以这种方式访问​​参数...

from pylons import request
c = request.params.get("c")
#or
c = request.params["c"]

这将在任何一种情况下都返回“4”作为值,因为在这些情况下忽略除最后一个值之外的所有值似乎是标准行为。我真正需要的是能够同时访问两者。我尝试打印出 request.params 并得到这样的东西......

NestedMultiDict([(u'c', u'1'),(u'v', u'3'),(u'c', u'4')])

我还没有找到一种方法来索引它,或者访问 c 的第一个值。

我发现了一个与此问题相关的类似问题,但使用 PHP 解决了:

这些方面的东西对我来说效果很好,但也许一些 Python 代码适合 Pylons。有没有人处理过这样的事情?

4

2 回答 2

8

从文档 - http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/glossary.html#term-multidict

multidict 一个有序字典,每个键可以有多个值。将方法 getall、getone、mixed、add 和 dict_of_lists 添加到普通字典接口。请参阅 Multidict 和 pyramid.interfaces.IMultiDict。

所以只需调用:

request.params.getall('c')
于 2013-02-06T17:15:03.410 回答
1

作为练习,另一个问题中 PHP 的 Python 渲染(还包括一个虚拟参数来说明对 url 解码的需要):

from urlparse import urlparse
from urllib import unquote

url = 'http://www.example.com/action?c=1&v=3&c=4&d=%3A%24%23%40%3D%3F%25%5EQ%5E%24'

url = urlparse(url)

params = url.query.split('&')
params = [ tuple(p.split('=')) for p in params ]
params = [ [unquote(p[0]), unquote(p[1])] for p in params ]

print params

# [['c', '1'], ['v', '3'], ['c', '4'], ['d', ':$#@=?%^Q^$']]
于 2013-02-06T17:28:30.103 回答