2016-06-20 3 views
3

ich diesen Code verwenden, um einige Daten zu einem Django betriebene Website zu veröffentlichen:Django macht eine QueryDict von JSON-Daten

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)) 

Doch wenn ich lese, dass Daten in Django, es in ein QueryDict analysiert hat:

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

die Rohdaten werden direkt von request.data genommen in Bezug auf die Funktion gegeben, die von der urls.py Routing bezeichnet wird.

Wenn Sie die gleiche Art von Daten von einer Android-App POST, funktioniert es gut. Die Rohdaten sind eine Zeichenfolge und können von JSON aus korrekt analysiert werden.

+2

'POST'ed Rohdaten sollten in' request.body' ([Django docs] (https://docs.djangoproject.com/ja/1.9/ref/request-response/#django.http.HttpRequest) sein. Karosserie)). – C14L

+1

Was ist der Inhaltstyp, der auf der Django-Seite angezeigt wird? Django sollte nur die Abfrage dict füllen, wenn die Eingabe eine der folgenden ist: multipart/form-data oder application/x-form-urlencoded. 'urllib2' stellt automatisch' 'application/x-www.form-urlencoded' 'ein und ich bin mir nicht sicher, wie dies mit der Einstellung' addheaders' auf dem Opener zusammenwirkt. – dhke

+0

@dhke Wie kann ich den Inhaltstyp herausfinden, der auf der Django-Seite angezeigt wird? –

Antwort

0

Wie @dhke in den Kommentaren sagte, ist das Problem, dass urllib2application/x-www.form-urlencoded standardmäßig verwenden wird. Eine schnelle Suche online gab mir diesen Code:

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

, die wie erwartet funktioniert.

Verwandte Themen