J'ai ceci dans mon flacon views.py
def showpage():
...
test = [1,2,3,4,5,6]
return render_template("sample.html",test=test)
J'ai ceci dans mon échantillon .html
<script> var counts = {{test}}; </script>
Cela me donne une variable de nombre vide. Comment puis-je obtenir le même nombre que la liste de tests en python?
Lorsque vous insérez une variable dans le modèle {{ test }}
, il prend une représentation d'objet. Pour la liste de int [1,2,3,4,5,6]
, il sera rendu sous la forme [1, 2, 3, 4, 5, 6]
; il s'agit donc d'un tableau javascript valide, mais cette méthode ne sécurise pas les objets complexes sans représentation javascript, par exemple, test = [1,2,3,4,5, any] sera rendu sous la forme [1, 2, 3, 4, 5, <built-in function any>]
; toutefois, ce n'est qu'un exemple et ne fonctionnera jamais.
Pour transtyper implicitement un objet javascript dans une fiole, existez tojson
filter:
<script> var counts = {{ test|tojson }}; </script>
Ainsi, si l'objet est sérialisable JSON, tout sera rendu, sinon le moteur de modèle déclenchera une exception.
Vous pouvez également envoyer du code javascript à votre modèle:
from flask import json
return render_template("sample.html",test=json.dumps(test))
mais ce n'est pas une bonne approche et il vaut mieux utiliser le filtre tojson
qui est également sûr pour le balisage HTML.
Je préfère ne pas mélanger de code javascript dans les modèles et séparer les modèles, les données javascript et javascript avec ajax. Si cette approche est difficile, je préférerais utiliser le filtre tojson
.
Vous utilisez json.dumps dans la vue des flacons et JSON.parse dans le code javascript.
Dans la vue python:
def showpage():
...
test = [1,2,3,4,5,6]
test = json.dumps(test)
return render_template("sample.html",test=test)
Dans le code JavaScript:
<script> var counts = JSON.parse("{{ test }}"); </script>
Vous pouvez aussi utiliser
{{ test|safe }}
ou
{{ test|tojson|safe }}
Le filtre safe
doit être utilisé dans les balises de script.
Vous essayez de retourner dictionnaire depuis votre fonction showpage python comme suit et cela fonctionnera:
def showpage():
"""Your logic for getting the list to return """
test_dict = {"data_list": [1,2,3,4,5]}
return render_template("sample.html", test=test_dict)