Ответ 1
Вы публикуете JSON, который не совпадает с данными в форме. Вы должны получить значение request.body
и десериализировать его:
data = json.loads(request.body)
custom_decks = data['custom_decks']
Я пытаюсь проверить представление, я получаю запрос 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 с помощью одного ключа.
Я ценю все, что помогает.
Спасибо
Вы публикуете JSON, который не совпадает с данными в форме. Вы должны получить значение request.body
и десериализировать его:
data = json.loads(request.body)
custom_decks = data['custom_decks']
Поскольку у меня возникли проблемы с получением данных 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.
Так как HttpRequest имеет метод read() загрузка JSON из запроса на самом деле так же просто, как:
def post(self, request, *args, **kwargs):
import json
data = json.load(request)
return JsonResponse(data=data)
Если вы поместите это как представление, вы можете протестировать его, и он будет эхом от любого отправленного вами JSON.
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')
.