2016-06-20 3 views
3

я использую этот код, чтобы получить возможность отправлять некоторые данные на сайт в Django с питанием:Django делает QueryDict из данных JSON

url = "http://example.com:8080/api/v1/data/" 
request = {"info": "", "data": [{"extra": 0, "amount": 100, "id": "10000000016"}, {"extra": 0, "amount": 100, "id": "10000000002"}]} 
opener = urllib2.build_opener() 
opener.addheaders = [("Authorization", "Token "+self.token), 
        ("Accept", "application/json"), 
        ("Content-Type", "application/json; charset=UTF-8")] 
opener.open(url, json.dumps(request)) 

Тем не менее, когда я прочитал, что данные в Django, он разобран его в QueryDict:

Raw data received: <QueryDict: {u'{"info": "", ... 0002"}]}': [u'']}> 

Исходные данные берется непосредственно из request.data, как указано на функцию, которая вызывается из urls.py маршрутизации.

При отправке одного и того же вида данных из приложения для Android он отлично работает. Необработанные данные являются строкой и могут быть правильно проанализированы из JSON.

+2

'POST'ed необработанные данные должны быть в' request.body' ([Django docs] (https://docs.djangoproject.com/ja/1.9/ref/request-response/#django.http.HttpRequest. тело)). – C14L

+1

Какой тип содержимого отображается на стороне django? Django должен заполнять запрос dict только в том случае, если вход является одним из «multipart/form-data» или «application/x-www.form-urlencoded». 'urllib2' автоматически устанавливает' 'application/x-www.form-urlencoded', и я не уверен, как это взаимодействует с установкой' addheaders' на открытии. – dhke

+0

@dhke Как узнать тип контента, который появляется на стороне django? –

ответ

0

Как @dhke сказал в комментариях, проблема в том, что urllib2 будет использовать application/x-www.form-urlencoded по умолчанию. Быстрый поиск в Интернете дал мне этот код:

r = urllib.Request(url, data=json.dumps(request), headers={..}) 
urllib2.urlopen(req) 

который работает должным образом.