2012-07-03 17 views
22

sistema de plantillas de Django proporciona algunas opciones (filtros) para escapar contenidos en el html, pero son un poco confuso para mí como un principiante. Digamos que estoy siguiendo un tutorial para hacer un blog simple, y el contenido del blog debe ser escapado. Confío en el contenido porque soy el único que lo edita. Entonces, la pregunta es, ¿debería hacerlo como {{ post.content|autoescape }}, {{ post.content|escape }} o {{ post.content|safe }} en el html?plantillas de Django escapar

Gracias

EDIT: ¿Qué filtro debería utilizar para tener caracteres especiales para convertirlo a HTML entidades de forma automática?

EDIT 2: Me acabo de dar cuenta que autoescape no es un filtro válido.

Respuesta

32

escape HTML está activado por defecto en las plantillas de Django.

Autoescape es una etiqueta. no es un filtro:

{% autoescape on %} 
    {{ post.content }} 
{% endautoescape %} 

El filtro 'escape' escapa del HTML de una cadena.Específicamente, se hace que estos reemplazos:

  • < se convierte en &lt;
  • > se convierte en &gt;
  • '(comilla simple) se convierte en &#39;
  • "(comillas dobles) se convierte en &quot;
  • & se convierte en &amp;

El 'force_escape' es casi idéntico a 'escape' excepto en algunos casos de esquina.

El filtro "seguro" marcará su contenido como seguro, por lo que no se escapará (se enviará al navegador como está).

¿Qué filtro debo usar para convertir caracteres especiales en entidades html automáticamente?

Bueno, quieres decir, como convertir à al &Atilde;? Quédese con la codificación utf-8 y olvídese de eso.

+0

Muy útil al enumerar los caracteres. ¿Funciona este filtro 'escape' para _both_ texto del elemento HTML y valores de atributo? p.ej. '{{ text }}' –

+0

@ BobStein-VisiBone Supongo que funciona en todas partes, pero no estoy seguro de entender su pregunta. A veces es mejor publicar una nueva pregunta porque es más probable que ayude a otros con las mismas dudas. –

+6

@ BobStein-VisiBone en un lugar donde el filtro de escape puede no funcionar bien está dentro de '', en este caso use '{{value | escapejs}}' –

0

Para evitar escape de uso "seguro" (https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe):

marcas de una cadena que no se exige más HTML escapar antes de la salida. Cuando el autoescaping está desactivado, este filtro no tiene efecto.

Para escapar el uso de "escape" (https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape):

Escapes HTML de una cadena.

+0

que tenemos ahora. Todavía estaba confundido con "seguro" y "escape". – user14412

8

Su pregunta muestra que está un poco confundido acerca de lo que escapa.

El escape está convirtiendo caracteres no seguros, como etiquetas HTML, en escapó versiones para que el contenido malicioso, como las etiquetas de script, no arruine su sitio. Django hace esto por defecto en todo el contenido presentado en una plantilla de una variable.

Parece ser que usted es el único que está editando su contenido de modo que lo que desea es representar sus variables sin el escape automático. Entonces, para eso, debe marcarlo como seguro. Puede hacer esto en la plantilla, envolviendo todo el lote en etiquetas {% autoescape off %}...{% endautoescape %} o mediante el filtro {{ myvar|safe }} en variables individuales. O bien, puede hacerlo en la vista, llamando al mark_safe(myvar) en variables individuales antes de pasarlas a la plantilla.

+0

Gracias por su respuesta. En realidad estoy tratando de escapar de los contenidos en lugar de marcarlos como seguros. Pensé que el filtro seguro significa hacer que el contenido sea seguro ... – user14412

12

en primer lugar, debe escapar de su contenido porque nunca se sabe (incluso si usted es el que ingresa los datos) si va a necesitar un carácter especial (como <,>,).

La sintaxis que se utiliza programa que está incómodo con el uso de escapar:

este

{% autoescape on %} 
    {{ content }} 
{% endautoescape %} 

es exactamente el mismo que este

{{ content|escape }} 

este

{{ content }} 

es exactamente el mismo que este < - Editar: Si el autoescape es OFF (gracias a Paulo Scardine)

{{ content|safe }} 

seguro es el uso de esa manera:

{% autoescape on %} 
    {{ content }} <-- escape 
    {{ content|safe }} <-- not escape 
{% endautoescape %} 
+0

'content' y' content | safe' serán las mismas si 'autoescape' está desactivado, que no es el AFAIK predeterminado. –

+0

¡Gracias! Pensé que la salvación y el escape son similares ... – user14412

Cuestiones relacionadas