【问题标题】:How to get multiple parameters with same name from a URL in Pylons?如何从 Pylons 中的 URL 获取多个同名参数?
【发布时间】:2013-01-21 23:40:33
【问题描述】:

不幸的是,我发现自己需要修改现有的 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 的第一个值。

我找到了一个与此问题相关的similar question,但用 PHP 解决了:

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

【问题讨论】:

  • 感谢您修复格式!结果显然不是我的意图......
  • 如果我错了,请纠正我,但同一请求中不能存在多个 KEY 对象?这违反了所有定义..
  • 你是说不应该有两个同名的参数?如果这是您的问题,我同意最佳做法会避免它。但这并不是严格禁止的。例如,尝试在浏览器中输入此 URL (google.com/search?q=one&q=two)。有两个查询参数,因此 Google 将它们合二为一。这或多或少是我希望能够做到的。
  • 或者你可能是说字典不应该包含两个不同条目的“c”键?我不认为他们可以,但是我又不是很熟悉“NestedMultiDict”。在发布此内容时,我试图弄清楚它们是如何工作的。
  • 我在问/说明最好的做法是理解 URL 在某种意义上是一个平面字典,并且根据它声明的 HTTP1.1 的 RFC(这是我想要的部分如果我错了,请更正)KEY 对象就是那个,键.. 如果需要,该键的值应该包含多个选项,但不是做 q=one&q=two 它应该是 q=[1 ,2,3,4] 可以说。但同样,我可能错了,我只是想学一两件事,而不用我愚蠢的答案来回答你的问题:)

标签: python url parameters pylons


【解决方案1】:

作为练习,在other question 中用 Python 渲染 PHP(还包括一个虚拟参数来说明对 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^$']]

【讨论】:

  • 严格来说,我实际上并没有将 url 作为字符串,尽管我有包括 GET 在内的整个请求,我可以从中解析出 url。这种方法似乎也有效,但在 Pylons 应用程序的上下文中稍微复杂一些。不过,我会给它一个 +1,希望它能帮助遇到类似问题的人。
  • 谢谢——我确实是本着同样的精神提出的,正确的答案当然是 Jon Clements 的答案。
【解决方案2】:

来自文档 - 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')

【讨论】:

  • 完美答案,我很欣赏这些文档作为参考。太感谢了! +1 并接受
猜你喜欢
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多