python - pelicula - Obtener cuerpo de solicitud como cadena en Django
python django documentation (2)
Creo que el otro extremo del que recibe esta solicitud no convierte los datos a JSON antes de enviar la solicitud. O tiene que convertir los datos a JSON antes de enviarlos o simplemente intente acceder a request.body en su vista.
Estoy enviando una solicitud POST con el cuerpo JSON a un servidor Django (bastante estándar). En el servidor necesito decodificar esto usando json.loads()
.
El problema es ¿cómo obtengo el cuerpo de la solicitud en un formato de cadena?
Tengo el siguiente código actualmente:
body_data = {}
if request.META.get(''CONTENT_TYPE'', '''').lower() == ''application/json'' and len(request.body) > 0:
try:
body_data = json.loads(request.body)
except Exception as e:
return HttpResponseBadRequest(json.dumps({''error'': ''Invalid request: {0}''.format(str(e))}), content_type="application/json")
Sin embargo, esto da un error de que the JSON object must be str, not ''bytes''
.
¿Cómo recupero el cuerpo de la solicitud como una cadena, con la codificación correcta aplicada?
El cuerpo de la solicitud, request.body
, es una cadena de bytes. En Python 3, json.loads()
solo aceptará una cadena Unicode, por lo que debe decodificar request.body
antes de pasarlo a json.loads()
.
body_unicode = request.body.decode(''utf-8'')
body_data = json.loads(body_unicode)
En Python 2, json.loads
aceptará una cadena Unicode o una cadena de bytes, por lo que el paso de decodificación no es necesario.
Cuando decodifiques la cadena, creo que puedes asumir con seguridad ''utf-8''. No puedo encontrar una fuente definitiva para esto, pero consulta la siguiente cita en la documentación de jQuery :
Nota: La especificación XMLHttpRequest del W3C dicta que el conjunto de caracteres siempre es UTF-8; especificar otro juego de caracteres no obligará al navegador a cambiar la codificación.
En Python 3.6, json.loads()
acepta bytes o bytearrays . Por lo tanto, no es necesario que decodifique request.body
(suponiendo que esté codificado en UTF-8).