2010-09-16 64 views
3

當我發送POST消息到GAE使用POST服務器解析的的QueryDict不會被解析就像一個JSON一個JSON參數...問題的Django/GAE

我發現了一個類似的在這個問題上的問題:iphone Json POST request to Django server creates QueryDict within QueryDict

也許是GAE配置的問題。我已經使用最新版GAE的Python 2.6.6。首先,如果我得到這個職位,以數控刀具,開機自檢消息是完美的:

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 

和IDEA¿?

在服務器中的查詢字典是<QueryDict: {u'{"id":"xxx","jsonrpc":"2.0","method":"XXX","params":{...}}': [u'']}>

正如你可以檢查Django的處理程序解析POST請求作爲新字典的一個關鍵的JSON ...

在鏈接的問題,還有的下一個解決方案...

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,並將它與我的代碼一起打包。對於內置JSON和simplejson的API基本上是相同的(也許我只是沒有注意到有什麼不同),所以只需要導入它像這樣:

import simplejson as json 

並使用它就像你已經習慣了。

現在,至於QueryDict。是的,你得到的是原始的POST數據,沒有理由將它解析爲json並假裝它是一個普通的基於查詢的POST請求。老實說,我從來沒有想過django甚至能夠爲我們做出這種判斷的飛躍。所以,讓你的數據使用這些方針的東西:

data = json.loads(request.raw_post_data) 

爲了什麼Django的期待在這裏有原始的POST數據的檢查,看的參考:http://en.wikipedia.org/wiki/POST_(HTTP),特別是關於如何位應用程序/ x-WWW-形式urlencoded作品。

+2

其實你不必須用您的代碼上傳simplejson 。它可以通過App Engine直接訪問:從django.utils import simplejson – Franck 2010-09-16 14:07:35

+0

對於提供相同解決方案的另一個問題也有一個答案:http://stackoverflow.com/questions/1208067/wheres-my-json-data-in- my-incoming-django-request/3244765#3244765 – Franck 2010-09-16 14:10:29

+0

對不起,我已經在使用simplejson了。順便說一句,這個方法simplejson.loads(request.raw_post_data)完美工作。謝謝!!! – 2010-09-16 14:11:20

1
import simplejson 

取出並使用

data = simplejson.loads(request.body) 

代替request.raw_post_data