【问题标题】:Un-"jQuery $.param" in Server Side Python (GAE)在服务器端 Python (GAE) 中取消“jQuery $.param”
【发布时间】:2011-08-12 16:00:48
【问题描述】:

我正在使用 jQuery 的 $.post() 方法来发布 JSON 数据,特别是我正在发布一个数组。

$.post('/my/url/',{my_list:['foo','bar','foo baz']})

我在文档中读到 post 方法将使用 $.param 方法将作为数据提供给它的 JSON 对象序列化。 jQuery 文档似乎暗示他们的序列化方法是一个经常使用的标准(至少在 Ruby on Rails 和 PHP 中),但我似乎找不到任何方便的模块/方法自动取消序列化 $.param 在蟒蛇。

在 Python 中取消param-aterize 数据的最简单方法是什么?更具体地说,我使用的是 Google App Engine。

谢谢!

编辑:为数据添加了my_list 键。

【问题讨论】:

    标签: jquery python json google-app-engine http-post


    【解决方案1】:

    jquery-unparam 处理嵌套数据结构比 urlparse 更好!例如:

    // as produced by $.get, $.post etc
    $.param({a: 1, b: [2,3,4], c: { d: 5 } })
    "a=1&b%5B%5D=2&b%5B%5D=3&b%5B%5D=4&c%5Bd%5D=5"
    

    jquery_unparam 与 urlparse.parse_qs 的 Python:

    >>> from jquery_unparam import jquery_unparam
    >>> jquery_unparam("a=1&b%5B%5D=2&b%5B%5D=3&b%5B%5D=4&c%5Bd%5D=5")
    {'a': '1', 'c': {'d': '5'}, 'b': ['2', '3', '4']}
    
    >>> from urlparse import parse_qs
    >>> parse_qs("a=1&b%5B%5D=2&b%5B%5D=3&b%5B%5D=4&c%5Bd%5D=5")
    {'a': ['1'], 'b[]': ['2', '3', '4'], 'c[d]': ['5']}
    

    【讨论】:

      【解决方案2】:

      我相信JQuery $.post() 将 url 编码的表单变量发送到服务器,而不是 JSON 键值。所以这个:

      $.post('/foo', {foo: "bar", nums: [1, 2, 3]})
      

      导致以下application/x-www-form-urlencoded 数据被发布 给/foo

      foo=bar&nums%5B%5D=1&nums%5B%5D=2&nums%5B%5D=3
      

      你可以在 Python 中使用 urlparse.parse_qs 解析:

      >>> import urlparse
      >>> urlparse.parse_qs('foo=bar&nums%5B%5D=1&nums%5B%5D=2&nums%5B%5D=3')
      {'foo': ['bar'], 'nums[]': ['1', '2', '3']}
      

      【讨论】:

      • 嗯,他发送的是一个数组,而不是单独的值。
      【解决方案3】:

      想通了!

      尤其是在 Google App Engine 中,Request 对象的 get_all 方法处理使用 jQuery 的 .param 方法序列化的 JSON 数组。

      稍微令人困惑的部分是 jQuery 将 [] 添加到参数键的末尾。因此,您使用的 Python 代码是...

      class MyListHandler(webapp.RequestHandler):
          def post(self):
              print self.request.get_all('my_list[]') # <-- Note the `[]`
      

      ...这将打印...

      [u'foo', u'bar', u'foo baz']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-01
        • 2011-02-01
        • 2010-09-22
        • 1970-01-01
        • 2012-01-15
        • 2012-06-30
        • 2017-09-20
        • 2016-04-07
        相关资源
        最近更新 更多