Vous pouvez utiliser {{ variable }}
n'importe où dans votre modèle, pas seulement dans la partie HTML. Donc, cela devrait fonctionner:
<html>
<head>
<script>
var someJavaScriptVar = '{{ geocode[1] }}';
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: {{ geocode[0] }} ' + someJavaScriptVar)" />
</body>
</html>
Considérez-le comme un processus en deux étapes: Premièrement, Jinja (le moteur de modèle utilisé par Flask) génère votre sortie texte. Ceci est envoyé à l'utilisateur qui exécute le JavaScript qu'il voit. Si vous souhaitez que votre variable Flask soit disponible en JavaScript sous forme de tableau, vous devez générer une définition de tableau dans votre sortie:
<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 propose également des constructions plus avancées de Python, vous pouvez donc les raccourcir en:
<html>
<head>
<script>
var myGeocode = [{{ ', '.join(geocode) }}];
</script>
</head>
<body>
<p>Hello World</p>
<button onclick="alert('Geocode: ' + myGeocode[0] + ' ' + myGeocode[1])" />
</body>
</html>
Vous pouvez également utiliser des for
boucles, des if
instructions et bien d'autres, voir la documentation Jinja2 pour plus.
Jetez également un œil à la réponse de Ford qui souligne le tojson
filtre qui est un ajout à l'ensemble standard de filtres de Jinja2 .
Edit Nov 2018: tojson
est maintenant inclus dans l'ensemble standard de filtres de Jinja2.
json
module pour vider vos données sous la forme d'un objet jsonLe moyen idéal pour obtenir à peu près n'importe quel objet Python dans un objet JavaScript est d'utiliser JSON. JSON est un excellent format pour le transfert entre les systèmes, mais nous oublions parfois qu'il signifie JavaScript Object Notation. Cela signifie que l'injection de JSON dans le modèle est identique à l'injection de code JavaScript qui décrit l'objet.
Flask fournit un filtre Jinja pour cela:
tojson
vide la structure dans une chaîne JSON et la marque comme sûre afin que Jinja ne l'échappe pas automatiquement.Cela fonctionne pour toute structure Python sérialisable JSON:
la source
Uncaught SyntaxError: Unexpected token &
dans la console javascript.TypeError: Object of type Undefined is not JSON serializable
L'utilisation d'un attribut de données sur un élément HTML évite d'avoir à utiliser des scripts en ligne, ce qui signifie que vous pouvez utiliser des règles CSP plus strictes pour une sécurité accrue.
Spécifiez un attribut de données comme ceci:
Ensuite, accédez-y dans un fichier JavaScript statique comme ceci:
la source
Vous pouvez également ajouter un point de terminaison pour renvoyer votre variable:
Ensuite, faites un XHR pour le récupérer:
la source
Juste une autre solution alternative pour ceux qui veulent passer des variables à un script qui provient de flask, j'ai seulement réussi à faire fonctionner cela en définissant les variables à l'extérieur, puis en appelant le script comme suit:
Si j'entre des variables jinja,
test123.js
cela ne fonctionne pas et vous obtiendrez une erreur.la source
/static/test123.js
) que vous ne comprenez pas comment<script>
s avecsrc
. Ce n'est pas une fonctionnalité Flask. Le navigateur , lorsqu'il analyse un tel script, fait une requête HTTP distincte pour obtenir le script. Le contenu du script n'est pas intégré au modèle par Flask; en effet, Flask a probablement fini d'envoyer le modèle HTML au navigateur au moment où le navigateur demande même le script.Des réponses de travail sont déjà données, mais je souhaite ajouter une vérification qui agit comme une sécurité intégrée au cas où la variable flask ne serait pas disponible. Lorsque vous utilisez:
s'il y a une erreur qui rend la variable inexistante, les erreurs qui en résultent peuvent produire des résultats inattendus. Pour éviter cela:
la source
Cela utilise jinja2 pour transformer le tuple de géocodage en une chaîne json, puis le javascript le
JSON.parse
transforme en un tableau javascript.la source
Eh bien, j'ai une méthode délicate pour ce travail. L'idée est la suivante:
Créez des balises HTML invisibles comme
<label>, <p>, <input>
etc. dans le corps HTML et créez un modèle dans l'identifiant de la balise, par exemple, utilisez l'index de liste dans l'identifiant de la balise et la valeur de la liste au nom de la classe de balise.Ici, j'ai deux listes maintenance_next [] et maintenance_block_time [] de même longueur. Je veux transmettre les données de ces deux listes à javascript en utilisant le flacon. Je prends donc une étiquette d'étiquette invisible et définit son nom de balise comme un modèle d'index de liste et définit son nom de classe comme valeur à l'index.
Après cela, je récupère les données en javascript en utilisant une simple opération javascript.
la source
Certains fichiers js proviennent du Web ou de la bibliothèque, ils ne sont pas écrits par vous-même. Le code qu'ils obtiennent variable comme ceci:
Cette méthode rend les fichiers js inchangés (garde l'indépendance) et passe la variable correctement!
la source