Проблемы для разбора POST JSON сообщения Django / GAE - PullRequest
3 голосов
/ 16 сентября 2010

Когда я отправляю сообщение POST в GAE с параметрами json, используя POST, QueryDict, анализируемый сервером, не анализируется как json ...

Я обнаружил похожую проблему в этой проблеме: POST-запрос iphone Json к серверу Django создает QueryDict в QueryDict

Возможно, это проблема с конфигурацией GAE.У меня Python 2.6.6 с последней версией GAE.Прежде всего, если я получаю POST с помощью инструмента nc, POST-сообщение идеально подходит:

POST /url/ HTTP/1.1
Accept: application/jsonrequest
Content-type: application/json
Accept-Encoding: gzip
Content-Length: 458
Host: 192.168.1.1:8080
Connection: Keep-Alive

{"id":"xxx","jsonrpc":"2.0","method":"XXX","params":{...}]}

И в консоли сервера я получаю следующие сообщения:

DEBUG    2010-09-16 06:47:05,891 dev_appserver.py:1693] Access to module file denied: /usr/lib/pymodules/python2.6/simplejson
DEBUG    2010-09-16 06:47:05,894 dev_appserver.py:1700] Could not import "_json": Disallowed C-extension or built-in module
DEBUG    2010-09-16 06:47:05,897 dev_appserver.py:1700] Could not import "_json": Disallowed C-extension or built-in module

Иидея ¿?

Запрос на сервере: <QueryDict: {u'{"id":"xxx","jsonrpc":"2.0","method":"XXX","params":{...}}': [u'']}>

Поскольку вы можете проверить обработчик django, проанализируйте json запроса POST как ключ нового словаря ...

В связанной проблеме есть следующее решение ...

hack_json_value = request.POST.keys()[0]
hack_query_dict = json.loads(hack_json_value)
foo = hack_query_dict['foo']
bar = hack_query_dict['bar']

, но, может быть, вы поможете мне найти другое ...

Спасибо,

Ответы [ 3 ]

7 голосов
/ 16 сентября 2010

Первое, что вам нужно помнить при работе с json, это то, что AppEngine живет с python 2.5. Это означает, что json еще не является стандартной частью python.

Чтобы решить эту проблему, я где-то в сети нашел simplejson и упаковал его вместе с моим кодом. API для встроенных json и simplejson по сути одинаковы (или, может быть, я просто не заметил ничего другого), поэтому просто импортируйте его так:

import simplejson as json

И используйте его так, как привыкли.

Теперь, что касается QueryDict. Да, то, что вы получаете, это необработанные данные POST, нет логической причины для того, чтобы они анализировались как json и играли, притворяясь, что это обычный запрос POST на основе запроса. Честно говоря, я никогда не думал, что Джанго мог даже сделать этот прыжок для нас. Итак, чтобы получить ваши данные, используйте что-то вроде этого:

data = json.loads(request.raw_post_data)

Для справки о том, что django ожидал увидеть в необработанных данных POST, проверьте здесь: http://en.wikipedia.org/wiki/POST_(HTTP), конкретно о том, как работает application / x-www-form-urlencoded.

1 голос
/ 30 декабря 2013
import simplejson

и используйте

data = simplejson.loads(request.body)

вместо request.raw_post_data

1 голос
/ 21 января 2013

request.raw_post_data устарела в Django 1.4.3 и удалена в 1.5

https://github.com/django/django/commit/4a6490a4a0d0d7e45b1f549e3f9d97e5e2aeb731

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...