¿Cómo envío datos desde JS a Python con Flask?

Estoy creando un sitio web con Flask y me gustaría poder ejecutar el código de Python utilizando los datos de la página. Sé que simplemente puedo usar formularios, pero es una página única que se actualiza continuamente a medida que recibe comentarios del usuario y sería una molestia enorme tener que volver a cargar la página cada vez que sucede algo. Sé que puedo hacer {{ function() }} dentro del javascript, pero ¿cómo hago {{ function(args) }} dentro del javascript usando las variables js? Hasta ahora, lo único que se me ocurre es actualizar una base de datos externa como MongoDB con js y luego usar Python para leer, pero este proceso ralentizará bastante el sitio web.

El jQuery necesita obtener una lista de objetos de diccionario de la función Python que luego se puede usar en el HTML. Así que necesito poder hacer algo como:

JS:

 var dictlist = { getDictList(args) }; dictlist.each(function() { $("").text($(this)['Value']).appendTo("#element"); }); 

Pitón:

 def getDictList(args): return dictlistMadeFromArgs 

Para obtener datos de Javascript a Python con Flask, puede realizar una solicitud AJAX POST o AJAX GET con sus datos.

Flask tiene seis métodos HTTP disponibles , de los cuales solo necesitamos el GET y el POST. Ambos tomarán jsdata como parámetro, pero lo obtendrán de diferentes maneras. Así es como dos idiomas completamente diferentes en dos entornos diferentes como Python y Javascript intercambian datos.

Primero, instancia una ruta GET en Flask:

 @app.route('/getmethod/') def get_javascript_data(jsdata): return jsdata 

o un POST uno:

 @app.route('/postmethod', methods = ['POST']) def get_post_javascript_data(): jsdata = request.form['javascript_data'] return jsdata 

Se accede al primero mediante /getmethod/ con un AJAX GET de la siguiente manera:

 $.get( "/getmethod/" ); 

El segundo utilizando una solicitud POST AJAX :

 $.post( "/postmethod", { javascript_data: data }); 

Donde javascript_data es un dict de JSON o un valor simple.

En caso de que elija JSON, asegúrese de convertirlo en un dict en Python:

 json.loads(jsdata)[0] 

P.ej.

OBTENER:

 @app.route('/getmethod/') def get_javascript_data(jsdata): return json.loads(jsdata)[0] 

ENVIAR:

 @app.route('/postmethod', methods = ['POST']) def get_post_javascript_data(): jsdata = request.form['javascript_data'] return json.loads(jsdata)[0] 

Si necesita hacerlo al revés, empujando los datos de Python a Javascript, cree una ruta GET simple sin parámetros que devuelva un dict codificado en JSON:

 @app.route('/getpythondata') def get_python_data(): return json.dumps(pythondata) 

Recupéralo de JQuery y descifra:

 $.get("/getpythondata", function(data) { console.log($.parseJSON(data)) }) 

El [0] en json.loads(jsdata)[0] está allí porque cuando decodificas un dictado codificado JSON en Python, obtienes una lista con el dict único dentro, almacenado en el índice 0, por lo que tus datos decodificados JSON tienen este aspecto :

 [{'foo':'bar','baz':'jazz'}] #[0: {'foo':'bar','baz':'jazz'}] 

Ya que lo que necesitamos es el dictado justo dentro y no la lista, obtenemos el ítem almacenado en el índice 0, que es el dict.

Además, import json .