如何在Pylons中从URL获取多个相同名称的参数?
很不幸,我现在需要修改一个现有的Pylons应用程序,让它能够处理那些URL中有多个同名参数的情况。比如说,像下面这样...
域名:端口/动作?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解决的:
这种方法对我来说很有效,但我需要一些适合Pylons的Python代码。有没有人之前遇到过类似的情况?
2 个回答
1
作为一个练习,这段代码是用Python写的,目的是实现之前提到的PHP代码(具体内容可以在这个链接找到)。这段代码还包含了一个虚拟参数,用来说明为什么需要对网址进行解码:
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^$']]
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')