Puede usar {{ variable }}
cualquier parte de su plantilla, no solo en la parte HTML. Entonces esto debería funcionar:
<html>
<head>
<script>
var someJavaScriptVar = '{{ geocode[1] }}';
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: {{ geocode[0] }} ' + someJavaScriptVar)" />
</body>
</html>
Piense en ello como un proceso de dos etapas: primero, Jinja (el motor de plantillas que utiliza Flask) genera su salida de texto. Esto se envía al usuario que ejecuta el JavaScript que ve. Si desea que su variable Flask esté disponible en JavaScript como una matriz, debe generar una definición de matriz en su salida:
<html>
<head>
<script>
var myGeocode = ['{{ geocode[0] }}', '{{ geocode[1] }}'];
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: ' + myGeocode[0] + ' ' + myGeocode[1])" />
</body>
</html>
Jinja también ofrece construcciones más avanzadas de Python, por lo que puede acortarlo a:
<html>
<head>
<script>
var myGeocode = [{{ ', '.join(geocode) }}];
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: ' + myGeocode[0] + ' ' + myGeocode[1])" />
</body>
</html>
También puede usar for
bucles, if
declaraciones y muchos más, consulte la documentación de Jinja2 para obtener más información.
Además, eche un vistazo a la respuesta de Ford que señala el tojson
filtro, que es una adición al conjunto estándar de filtros de Jinja2 .
Editar noviembre de 2018: tojson
ahora está incluido en el conjunto estándar de filtros de Jinja2.
json
módulo para volcar sus datos en forma de un objeto jsonLa forma ideal de lograr que cualquier objeto de Python se convierta en un objeto JavaScript es usar JSON. JSON es excelente como formato para transferir entre sistemas, pero a veces olvidamos que significa JavaScript Object Notation. Esto significa que inyectar JSON en la plantilla es lo mismo que inyectar código JavaScript que describe el objeto.
Flask proporciona un filtro Jinja para esto:
tojson
volca la estructura en una cadena JSON y la marca como segura para que Jinja no se escape automáticamente.Esto funciona para cualquier estructura de Python que sea serializable JSON:
fuente
Uncaught SyntaxError: Unexpected token &
a la consola de JavaScript.TypeError: Object of type Undefined is not JSON serializable
El uso de un atributo de datos en un elemento HTML evita tener que usar secuencias de comandos en línea, lo que a su vez significa que puede usar reglas CSP más estrictas para una mayor seguridad.
Especifique un atributo de datos como este:
Luego acceda a él en un archivo JavaScript estático como este:
fuente
Alternativamente, podría agregar un punto final para devolver su variable:
Luego haz un XHR para recuperarlo:
fuente
Solo otra solución alternativa para aquellos que desean pasar variables a un script que se obtiene usando un matraz, solo logré hacer que esto funcione definiendo las variables fuera y luego llamando al script de la siguiente manera:
Si ingreso variables jinja en
test123.js
él no funciona y obtendrá un error.fuente
/static/test123.js
) que eres malentendido cómo<script>
s consrc
s trabajo. No son una característica de matraz. El navegador , cuando analiza dicho script, realiza una solicitud HTTP por separado para obtener el script. El contenido del script no se integra en la plantilla por Flask; de hecho, es probable que Flask haya terminado de enviar el HTML con plantilla al navegador para cuando el navegador incluso solicite el script.Ya se dan respuestas de trabajo, pero quiero agregar una verificación que actúa como una prueba de fallas en caso de que la variable frasco no esté disponible. Cuando usas:
Si hay un error que hace que la variable sea inexistente, los errores resultantes pueden producir resultados inesperados. Para evitar esto:
fuente
Esto usa jinja2 para convertir la tupla de geocodificación en una cadena json, y luego el javascript lo
JSON.parse
convierte en una matriz de javascript.fuente
Bueno, tengo un método complicado para este trabajo. La idea es la siguiente:
Cree algunas etiquetas HTML invisibles como
<label>, <p>, <input>
etc. en el cuerpo HTML y cree un patrón en la identificación de la etiqueta, por ejemplo, use el índice de la lista en la identificación de la etiqueta y el valor de la lista en el nombre de la clase de etiqueta.Aquí tengo dos listas maintenance_next [] y maintenance_block_time [] de la misma longitud. Quiero pasar los datos de estas dos listas a javascript usando el matraz. Así que tomo una etiqueta de etiqueta invisible y establezco su nombre de etiqueta como un patrón de índice de lista y establezco su nombre de clase como valor en el índice.
Después de esto, recupero los datos en javascript usando alguna operación simple de javascript.
fuente
Algunos archivos js provienen de la web o la biblioteca, no los ha escrito usted mismo. El código que obtienen variable como este:
Este método hace que los archivos js no cambien (mantenga la independencia) y pase la variable correctamente!
fuente