PRECAUCIÓN Comprobar#17419 billete para la discusión sobre la adición de etiquetas similar en Django núcleo y posibles vulnerabilidades XSS introducidas mediante el uso de esta etiqueta plantilla con los datos generados por el usuario. Comment de amacneil discute la mayoría de las preocupaciones planteadas en el boleto.
Creo que la forma más flexible y práctico de hacer esto es definir un filtro de plantilla para las variables que desee utilizar en el código JS. Esto le permite asegurarse de que sus datos se hayan escapado correctamente y que pueda usarlos con estructuras de datos complejas, como dict
y list
. Es por eso que escribo esta respuesta a pesar de que hay una respuesta aceptada con muchos votos ascendentes.
Aquí es un ejemplo de filtro de plantilla:
// myapp/templatetags/js.py
from django.utils.safestring import mark_safe
from django.template import Library
import json
register = Library()
@register.filter(is_safe=True)
def js(obj):
return mark_safe(json.dumps(obj))
estos Filtros plantilla convierte variable para cadena JSON. Se puede utilizar de este modo:
// myapp/templates/example.html
{% load js %}
<script type="text/javascript">
var someVar = {{ some_var | js }};
</script>
Tenga en cuenta que de acuerdo con [esta solución] (http://stackoverflow.com/questions/298772/django-template-variables-and-javascript/1187881#1187881), esto es vulnerable a los ataques de inyección – Casebash
@Casebash: Para tales ocasiones, existe el filtro 'escapejs':' escapejs ('<>') -> u '\\ u003C \\ u003E'' –
Solo para agregar a esto como referencia: si el "algúnDjangoVariable" resulta ser JSON , asegúrese de usar {{someDjangoVariable | safe}} para eliminar " – Mark