#jquery #python #json #google-app-engine #http-post
#jquery #python #json #google-движок приложений #http-post #google-app-engine
Вопрос:
Я использую $.post()
метод jQuery для публикации данных в формате 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
ключ к данным.
Ответ №1:
Понял это!
В 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']
Ответ №2:
Я полагаю, что jQuery $.post()
отправляет на сервер переменные формы в кодировке url, а не значения ключей JSON. Итак, это:
$.post('/foo', {foo: "bar", nums: [1, 2, 3]})
Результатом является публикация следующих application/x-www-form-urlencoded
данных
для /foo
:
foo=baramp;nums%5B]=1amp;nums%5B]=2amp;nums%5B]=3
Который вы можете проанализировать в Python с помощью urlparse.parse_qs
:
>>> import urlparse
>>> urlparse.parse_qs('foo=baramp;nums[]=1amp;nums[]=2amp;nums[]=3')
{'foo': ['bar'], 'nums[]': ['1', '2', '3']}
Комментарии:
1. Ну, он отправляет массив, а не отдельные значения.
Ответ №3:
jquery-unparam обрабатывает вложенные структуры данных лучше, чем urlparse! Например.:
// as produced by $.get, $.post etc
$.param({a: 1, b: [2,3,4], c: { d: 5 } })
"a=1amp;b[]=2amp;b[]=3amp;b[]=4amp;c[d]=5"
Python с помощью jquery_unparam против urlparse.parse_qs:
>>> from jquery_unparam import jquery_unparam
>>> jquery_unparam("a=1amp;b[]=2amp;b[]=3amp;b[]=4amp;c[d]=5")
{'a': '1', 'c': {'d': '5'}, 'b': ['2', '3', '4']}
>>> from urlparse import parse_qs
>>> parse_qs("a=1amp;b[]=2amp;b[]=3amp;b[]=4amp;c[d]=5")
{'a': ['1'], 'b[]': ['2', '3', '4'], 'c[d]': ['5']}