2010-09-16 2 views
3

Когда я отправить сообщение POST на GAE с параметрами JSon с использованием POST QueryDict разобран сервером не разобранные как JSON ...Проблем для синтаксического анализа сообщения POST JSon Джанго/GAE

Я нашел аналогичную проблема в этом выпуске: iphone Json POST request to Django server creates QueryDict within QueryDict

Возможно, проблема связана с конфигурацией GAE. У меня Python 2.6.6 с последней версией GAE. Прежде всего, если я получаю POST с помощью инструмента нанокристаллов, сообщение 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'']}>

Как вы можете проверить обработчик Джанго разбора 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'] 

но, возможно, вы можете помочь мне найти еще один ...

Спасибо,

ответ

7

Первое, что вам нужно запомнить при работе с 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) 

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

+2

На самом деле вы не нужно загрузить simplejson с кодом ,Он доступен непосредственно в App Engine через: из django.utils import simplejson – Franck

+0

Существует также ответ на другой вопрос, предоставляющий такое же решение: http://stackoverflow.com/questions/1208067/wheres-my-json-data-in- my-incoming-django-request/3244765 # 3244765 – Franck

+0

Да, извините, я уже использую simplejson. Btw этот метод simplejson.loads (request.raw_post_data) работает отлично. Благодаря!!! –

1
import simplejson 

и использовать

data = simplejson.loads(request.body) 

вместо request.raw_post_data

Смежные вопросы