Django запрос Post json

Я пытаюсь проверить представление, я получаю запрос json из IPad, формат:

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": []
}

Я проверил это в jsonlint, и он прошел.

Я отправляю req через:

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

Возврат представления "creation_success": false

Проблема заключается в том, что метод post не видит ключевые 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'']}>

Проблема заключается в том, что метод post не видит ключевых custom_decks. Потому что он конвертирует мой dict в QueryDict с помощью одного ключа.

Я ценю все, что помогает.

Спасибо

Ответ 1

Вы публикуете JSON, который не совпадает с данными в форме. Вы должны получить значение request.body и десериализировать его:

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

Ответ 2

Поскольку у меня возникли проблемы с получением данных JSON из HttpRequest напрямую с кодом другого ответа:

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

Ошибка:

the JSON object must be str, not 'bytes'

Ниже приведено обновление другого ответа для версии Python > 3:

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

Что касается декодирования ('utf-8'), как упоминается в:

RFC 4627:

"Текст JSON должен быть закодирован в Unicode. Кодировка по умолчанию UTF-8".

Я прикрепил ссылку Python к этой конкретной проблеме для версии > 3.

http://bugs.python.org/issue10976

Ответ 3

Так как HttpRequest имеет метод read() загрузка JSON из запроса на самом деле так же просто, как:

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

Если вы поместите это как представление, вы можете протестировать его, и он будет эхом от любого отправленного вами JSON.

Ответ 4

python 3.6 и django 2.0:

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

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

Изменено в версии 3.6: s теперь может иметь тип bytes или bytearray. Кодировка ввода должна быть UTF-8, UTF-16 или UTF-32.

От python 3.6 НЕТ необходимости request.body.decode('utf-8').