¿Cómo convertir una lista de diccionarios a JSON en Python / Django?

Busqué en Google y encontré una respuesta, pero no me funciona. Tengo que enviar una lista como JsonResponse en Django, similar a esto:

 list_to_json =[{"title": "hello there", "link": "www.domain.com", "date": ...}, {},{},{},...] 

Estoy convirtiendo esto a JSON aplicando StackOverflow question1 y question2 pero no funciona para mí. Obtuve el siguiente error:

Para permitir que los objetos que no son de dictado se serialicen, establezca el parámetro seguro en Falso

Aquí está mi código:

  def json_response(request): list_to_json=[{"title": ..., "link": ..., "date": ...},{...}] return JsonResponse(json.dumps(list_to_json) ) 

 return JsonResponse(list_to_json, safe=False) 

Echa un vistazo a la documentación :

El parámetro booleano seguro por defecto es True. Si se establece en False, se puede pasar cualquier objeto para la serialización (de lo contrario, solo se permiten las instancias de dictado). Si safe es True y se pasa un objeto no dictado como primer argumento, se generará un TypeError.

Debe incluir los serializadores o puede hacer esto usando safe = False para sus datos de respuesta.
Me gusta

 return JsonResponse(list_to_json, safe=False) 

Este no es un diccionario válido:

 {"title": , "link" : , "date": } 

Porque faltan los valores. Si intenta agregar los valores faltantes, funciona bien:

 >>> json.dumps([{"title": "hello there", "link": "www.domain.com", "date": 2016}, {}]) '[{"link": "www.domain.com", "date": 2016, "title": "hello there"}, {}]' 

Agregando esta respuesta a cualquiera que se pregunte por qué esto no es “seguro” por defecto. Al incluir una estructura de datos que no sea de dictado en una respuesta, el servicio es vulnerable a un ataque de secuestro JSON anterior a ES5.

Básicamente, con el JSONResponse que está utilizando aquí, si un usuario se autentica en su sitio, ahora puede recuperar esa lista de objetos {título, enlace, fecha} y eso está bien. Sin embargo, un atacante podría incluir ese punto final como una fuente de script en su propia página maliciosa (inclusión de script entre sitios, también conocido como XSSI):

  

Luego, si un usuario autenticado desprevenido navega a la página maliciosa, el navegador, sin saberlo, solicitará la matriz de datos de su sitio. Como su servicio solo está devolviendo una matriz no asignada, el atacante también debe envenenar el constructor de Array js (esta es la parte del ataque que se solucionó en ES5). Antes de ES5 , el atacante podría simplemente anular el constructor Array así:

 Array = function() {secret = this;} 

Ahora secret contiene su lista de diccionarios, y está disponible para el rest del script del atacante, donde puede enviarlo a su propio servidor. ES5 solucionó esto forzando el uso de corchetes para ser evaluados por el constructor de Array predeterminado.

¿Por qué esto nunca fue un problema para los objetos del diccionario? Simplemente porque los corchetes en javascript denotan un scope aislado, por lo que el atacante no tiene forma de inyectar su propio código en el scope creado por el diccionario devuelto que está rodeado por corchetes.

Más información aquí: https://security.stackexchange.com/questions/159609/how-is-it-possible-to-poison-javascript-array-constructor-and-how-does-ecmascrip?newreg=c70030debbca44248f54cec4cdf761bb