Un- "jQuery $ .param" в серверном Python (GAE) - PullRequest
2 голосов
/ 26 апреля 2011

Я использую метод jQuery $.post() для публикации данных JSON, в частности, я публикую массив.

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

Я прочитал в документации, что метод post будет использовать метод $.param для сериализации объектов JSON, переданных ему в качестве данных. Документы jQuery, кажется, подразумевают, что их метод сериализации является часто используемым стандартом (по крайней мере, в Ruby on Rails и PHP), но я не могу найти какие-либо удобные модули / методы, которые автоматически отменяют сериализацию $.param в Python.

Какой самый простой способ отменить param- атеризацию этих данных в Python? В частности, я использую Google App Engine.

Спасибо!

РЕДАКТИРОВАТЬ: Добавлен my_list ключ к данным.

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Понял!

В частности, в Google App Engine метод get_all объекта Request обрабатывает массивы JSON, сериализованные с помощью метода .param jQuery.

Немного сбивает с толку то, что 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']
3 голосов
/ 26 апреля 2011

Я полагаю, 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']}
2 голосов
/ 16 июня 2011

jquery-unparam обрабатывает вложенные структуры данных лучше, чем urlparse! E.g.:

// 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"

Python от jquery_unparam против urlparse.parse_qs:

>>> 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']}
...