Intenté buscar una respuesta y le di muchos intentos, pero algo extraño está sucediendo aquí. En mi opinión, tengo algunas funciones que operan con datos JSON que ingresan a través de AJAX. Actualmente estoy tratando de hacer algunas pruebas unitarias en estos.

En mi caso de prueba tengo:

kwargs = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
url = '/<correct_url>/upload/'
data = {
                "id" : p.id
}

c = Client()
response = c.delete(url, data, **kwargs)

content_unicode = response.content.decode('utf-8')
content = json.loads(content_unicode)

P.id es solo un número entero que proviene de un modelo que estoy usando.

Luego tengo una función que se está probando, parte de la cual se ve así:

def delete_ajax(self, request, *args, **kwargs):
    print (request.body)
    body_unicode = request.body.decode('utf-8')
    print (body_unicode)
    body_json = json.loads(body_unicode)

La primera declaración impresa produce:

.....b"{'id': 1}"

El otro:

{'id': 1}

Y finalmente obtengo un error para la cuarta línea de la siguiente manera:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

¿Qué va mal aquí? Entiendo que el formato JSON correcto debería ser {"id": 1} y eso es lo que estoy enviando desde mi caso de prueba. Pero en algún punto del camino se introducen comillas simples en la mezcla, lo que me causa dolor de cabeza.

¿Alguna idea?

0
xtrom0rt 6 dic. 2016 a las 15:26

1 respuesta

La mejor respuesta

Debe pasar una cadena json a Client.delete(), no un dictado de Python:

kwargs = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
url = '/<correct_url>/upload/'
data = json.dumps({
 "id" : p.id
 })

c = Client()
response = c.delete(url, data, **kwargs)

También debe establecer el encabezado de tipo de contenido en "application / json" y verificar el encabezado de tipo de contenido en su vista, pero ese es otro tema.

2
bruno desthuilliers 6 dic. 2016 a las 15:50
¡Gracias! Casi lo entiendo antes de tu respuesta, pero aún eras más rápido. La comprobación del tipo de contenido es lo siguiente que hay que tener en cuenta :)
 – 
xtrom0rt
6 dic. 2016 a las 16:02