2014-07-25 9 views
11

próbuję przetestować pogląd, że otrzyma żądanie json z iPada, format jest:Django kupna Wyślij 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": [] 
} 

Sprawdziłem to w jsonlint i przeszedł.

ja opublikować req poprzez:

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

widoku powrotnej "creation_success": false

Problemem jest metoda postu w widoku nie znaleźć klucz custom_decks.

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

Problem polega na tym, że metoda post w widoku nie znajduje klucza custom_decks. Ponieważ konwertuje mój dict do QueryDict za pomocą jednego klucza.

Doceniam wszystkie pomocne.

Dzięki

Odpowiedz

16

Ty księgowania JSON, który nie jest taki sam jak dane formularzy kodowane. Trzeba uzyskać wartość request.body i deserializować go:

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

Żądanie (req), jest napisane bezpośrednio w metodzie testowania i jest słownikiem, nie mogę użyć polecenia req.body. Jak postępować? dzięki – user3877330

+0

Ten komentarz nie ma sensu. Publikujesz słownik: jest odbierany jako JSON, który musisz odszyfrować. Jeśli ten kod nie działa, powinieneś pokazać błąd, który otrzymałeś. –

4

Ponieważ miałem problemy z uzyskaniem danych JSON z HttpRequest bezpośrednio z kodem drugiej odpowiedzi:

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

błąd:

the JSON object must be str, not 'bytes' 

Oto aktualizacja z drugiej odpowiedzi dla wersji Pythona> 3:

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

chodzi dekodowania ('utf-8'), jak wspomina w:

RFC 4627:

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

I załączony link Python odniósł się do tego konkretnego problemu dla wersji> 3 .

http://bugs.python.org/issue10976

0

Od HttpRequest has a read() method Ładowanie JSON z wniosku jest rzeczywiście tak proste, jak:

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

Jeśli umieścisz ten jako widoku, można go przetestować i będzie to echo żadnej JSON wysyłaniu wrócić do Ciebie.

0

python 3.6 i 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 .

Od python 3.6ma potrzebyrequest.body.decode('utf-8').