Pasando un objeto JSON de Flask a JavaScript

Tengo problemas para que una variable Flask / Python se pase a Javascript.

Básicamente, estoy importando desde MySQL y he intentado generar el rendimiento de tres maneras diferentes.

  1. (43.8934276, -103.3690243), (47.052060, -91.639868), (45.1118, -95.0396) que es la salida cuando mi ítem dict tiene lo siguiente ejecutado.

new_list = [tuple(d.values()) for d in MySQL_Dict] output = ', '.join('(' + ', '.join(i) + ')' for i in new_list)

Este método no es bueno, pero lo agregué para detalles, no está en el formato correcto.

  1. Paso el dictado de Python directamente a la plantilla que se ve así.

({'lat': '43.8934276', 'lng': '-103.3690243'}, {'lat': '47.052060', 'lng': '-91.639868'}, {'lat': '45.1118', 'lng': '-95.0396'})

Luego en el lado de la plantilla he probado las siguientes líneas de JavaScript

  var other_coords = {{ MySQL_Dict|tojson }}; var other_coords = {{ MySQL_Dict|tojson|safe }}; var still_more = JSON.parse(other_coords); 

Ninguno de los cuales funciona, juntos o por separado.

  1. También he intentado enviar el diccionario desde la vista usando json_out = json.dumps(My_Dict) que tampoco funciona.

Todo esto con el objective de obtener las colas de latencia, lng desde la base de datos MySQL a la secuencia de comandos de la API de Google Maps. Lo que me resulta tan confuso es que si simplemente pego los resultados de json.dump de la vista en el script de Google Maps, funciona perfectamente (después de eliminar las comillas), pero si uso una variable no funcionará para mí. ¿Alguien tiene sugerencias?

Parece que la respuesta actualmente aceptada (por @BrettJ) tiene un posible defecto de seguridad: si el objeto que pasamos a javascript tiene alguna cadena con una comilla en su interior, esta comilla simple no será json.dumps por json.dumps , lo que permitirá para inyectar código arbitrario en javascript. Es mejor usar el filtro de plantilla tojson() Flask, consulte los documentos , ya que permite que todos estos caracteres se escapen correctamente (reemplácelos con códigos Unicode).

Aquí está mi solución:

ver.py

 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello_world(): user = {'firstname': "Mr.", 'lastname': "My Father's Son"} return render_template("index.html", user=user) if __name__ == '__main__': app.run() 

index.html

 

Hello,

El JS generado se ve así:

 var user = JSON.parse('{"firstname": "Mr.", "lastname": "My Father\u0027s Son"}'); 

que es perfectamente seguro. Por ejemplo, si usaríamos la solución json.dumps json.dumps, obtendríamos

 var user = JSON.parse('{"firstname": "Mr.", "lastname": "My Father's Son"}'); 

lo que es sintácticamente incorrecto (por decir lo menos).

El siguiente ejemplo simple debería mostrar cómo obtener un objeto Javascript de su dictado:

vistas.py

 @app.route('/', methods=['GET','POST']) def index(): points = [{"lat": 43.8934276, "lng": -103.3690243}, {"lat": 47.052060, "lng": -91.639868}, {"lat": 45.1118, "lng": -95.0396}] return render_template("index.html", points=json.dumps(points)) 

index.html (algunos códigos eliminados por brevedad)

  function initMap() { var map = new google.maps.Map(document.getElementById('map'), { center: new google.maps.LatLng(43.8934276, -103.3690243), zoom: 4 }); var points = JSON.parse('{{ points|safe }}'); var marker; for (var i = 0; i < points.length; i++) { marker = new google.maps.Marker({ position: new google.maps.LatLng(points[i].lat, points[i].lng), map: map }); } }