2014-07-25 28 views
11

ich versuche, eine Ansicht zu testen, habe ich eine json Anfrage vom IPad erhalten, ist das Format:Django Anfrage Beitrag json

req = {"custom_decks": [ 
     { 
      "deck_name": "deck_test", 
      "updates_last_applied": "1406217357", 
      "created_date": 1406217380, 
      "slide_section_ids": [ 
       1 
      ], 
      "deck_id": 1 
     } 
      ], 
    "custom_decks_to_delete": [] 
} 

Ich habe dies in jsonlint und es übergeben.

poste ich die req über:

response = self.client.post('/library/api/6.0/user/'+ uuid + 
'/store_custom_dec/',content_type='application/json', data=req) 

Der Blick return "creation_success": false

Das Problem ist die post-Methode in Sicht nicht den Schlüssel custom_decks finden.

QueryDict: {u'{"custom_decks": [{"deck_id": 1, "slide_section_ids": [1], 
"created_date":1406217380, "deck_name": "deck_test"}], 
"custom_decks_to_delete": []}': [u'']}> 

Das Problem ist die Post-Methode in Sicht findet nicht den Schlüssel custom_decks. Weil es mein dict in QueryDict mit einem Schlüssel konvertiert.

Ich schätze alle Hilfen.

Dank

Antwort

16

Sie veröffentlichen JSON, die nicht das gleiche wie form codierten Daten. Sie müssen den Wert von request.body und deserialisieren es bekommen:

data = json.loads(request.body) 
custom_decks = data['custom_decks'] 
+0

Die Anfrage (req), es ist direkt in der Testmethode geschrieben, und es ist ein Wörterbuch, ich kann req.body nicht verwenden. Wie gehe ich vor? danke – user3877330

+0

Dieser Kommentar ergibt keinen Sinn. Sie veröffentlichen ein Wörterbuch: Es wird als JSON empfangen, das Sie dekodieren müssen. Wenn dieser Code nicht funktioniert, sollten Sie den Fehler anzeigen, den Sie erhalten. –

4

Da ich Probleme mit dem Erhalten JSON-Daten von Httprequest direkt mit dem Code der anderen Antwort mit:

data = json.loads(request.body) 
custom_decks = data['custom_decks'] 

Fehler:

the JSON object must be str, not 'bytes' 

Hier ist ein Update der anderen Antwort für Python-Version> 3:

json_str=((request.body).decode('utf-8')) 
json_obj=json.loads(json_str) 

Bezüglich decode ('utf-8'), wie erwähnt in:

RFC 4627:

"JSON text shall be encoded in Unicode. The default encoding is UTF-8."

ich der Python Link angebracht für die Version auf dieses spezifische Problem bezeichnet> 3 .

http://bugs.python.org/issue10976

0

Da HttpRequest has a read() method Laden JSON von der Anfrage ist eigentlich so einfach wie:

def post(self, request, *args, **kwargs): 
    import json 
    data = json.load(request) 
    return JsonResponse(data=data) 

Wenn Sie dies als Ansicht setzen, können Sie es testen, und es wird jede JSON echo Sie senden zurück zu dir.

0

python 3.6 und django 2.0:

post_json = json.loads(request.body) 
custom_decks = post_json.get("custom_decks") 

json.loads(s, *, encoding=None,...)

Changed in version 3.6 : s can now be of type bytes or bytearray . The input encoding should be UTF-8 , UTF-16 or UTF-32 .

Von python 3.6KEINE Notwendigkeitrequest.body.decode('utf-8').