如何在Pylons中从URL获取多个相同名称的参数?

7 投票
2 回答
4867 浏览
提问于 2025-04-17 14:59

很不幸,我现在需要修改一个现有的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')

撰写回答