started pelicula getting descargar python django

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).