Отменить «jQuery $.param» в серверном Python (GAE)

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