template - Django solicitud Publicar json
inclusion tags django (3)
Como HttpRequest tiene un método read (), cargar JSON desde la solicitud es realmente tan simple como:
def post(self, request, *args, **kwargs):
import json
data = json.load(request)
return JsonResponse(data=data)
Si pones esto como una vista, puedes probarlo y se hará eco de cualquier JSON que te enviemos.
Intento probar una vista, recibo una solicitud json desde el iPad, el formato es:
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": []
}
Revisé esto en jsonlint y pasó.
Publiqué la solicitud a través de:
response = self.client.post(''/library/api/6.0/user/''+ uuid +
''/store_custom_dec/'',content_type=''application/json'', data=req)
La vista devuelve "creation_success": falso
El problema es que el método de publicación a la vista no encuentra la clave 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'''']}>
El problema es que el método de publicación a la vista no encuentra la clave custom_decks. Porque está convirtiendo mi dict a QueryDict con una clave.
Agradezco todas las ayudas.
Gracias
Como estaba teniendo problemas para obtener datos JSON de HttpRequest directamente con el código de la otra respuesta:
data = json.loads(request.body)
custom_decks = data[''custom_decks'']
error:
the JSON object must be str, not ''bytes''
Aquí hay una actualización de la otra respuesta para Python versión> 3:
json_str=((request.body).decode(''utf-8''))
json_obj=json.loads(json_str)
En cuanto a la decodificación (''utf-8''), como se menciona en:
RFC 4627:
"El texto JSON se codificará en Unicode. La codificación predeterminada es UTF-8".
Adjunté el enlace de Python referido a este problema específico para la versión> 3.
Está publicando JSON, que no es lo mismo que datos codificados en forma. Necesita obtener el valor de request.body
y deserializarlo:
data = json.loads(request.body)
custom_decks = data[''custom_decks'']