2012-07-03 6 views
22

Il sistema di template di Django fornisce alcune opzioni (filtri) per l'escaping di contenuti in html, ma sono un po 'confusionali per me come principianti. Supponiamo che segua un tutorial per creare un blog semplice e che il contenuto del blog debba essere sfuggito: mi fido del contenuto perché sono l'unico a modificarlo. Quindi la domanda è: devo farlo come {{ post.content|autoescape }}, {{ post.content|escape }} o {{ post.content|safe }} nell'html?Django template escape

Grazie

EDIT: Quale filtro devo usare per avere caratteri speciali convertiti in HTML automaticamente entità?

MODIFICA 2: Ho appena realizzato che l'autoescape non è un filtro valido.

risposta

32

L'escape HTML è attivato per impostazione predefinita nei modelli Django.

Autoescape è un tag. non un filtro:

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

Il filtro "escape" sfugge all'HTML di una stringa.In particolare, rende queste sostituzioni:

  • < viene convertito in &lt;
  • > viene convertito in &gt;
  • '(virgoletta singola) viene convertito in &#39;
  • "(virgolette) viene convertito in &quot;
  • & viene convertito in &amp;

Il 'force_escape' è quasi identico a 'escape' tranne che per alcuni casi d'angolo.

Il filtro "sicuro" segnerà il contenuto come sicuro, quindi non sarà sfuggito (verrà inviato al browser così com'è).

Quale filtro devo utilizzare per far convertire automaticamente caratteri speciali in entità html?

Beh, vuoi dire, come convertire à in &Atilde;? Rimanere con la codifica utf-8 fino in fondo e dimenticarsi di quelli.

+0

Molto utile elencare i personaggi. Questo filtro 'escape' funziona con _both_ testo dell'elemento HTML e valori di attributo? per esempio. '{{ text }}' –

+0

@ BobStein-VisiBone Immagino che funzioni ovunque, ma non sono sicuro di aver capito la tua domanda. A volte è meglio pubblicare una nuova domanda perché è più probabile che aiuti gli altri con gli stessi dubbi. –

+6

@ BobStein-VisiBone sul posto in cui il filtro di escape potrebbe non funzionare bene è all'interno di '', in questo caso usare '{{valore | escapejs}}' –

0

Per evitare fuoriuscita uso "sicura" (https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe):

segna una stringa come non richiedono ulteriori HTML fuga prima uscita. Quando l'autoescaping è disattivato, questo filtro non ha alcun effetto.

Per uscire l'uso "escape" (https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape):

sfugge HTML di una stringa.

+0

Got ora. Era ancora confuso con "sicuro" e "fuga" però. – user14412

8

La tua domanda mostra che sei un po 'confuso su cosa sia la fuga.

Escaping si sta trasformando i caratteri non sicuri - come tag HTML - in sfuggito versioni in modo che i contenuti dannosi, quali i tag di script non rovinare il vostro sito. Django lo fa di default su tutto il contenuto reso in un modello da una variabile.

Sembra dal tuo commento che sei l'unico a modificare i tuoi contenuti che quello che vuoi è rendere le tue variabili senza l'escape automatico. Quindi, per quello, devi contrassegnarlo come sicuro. Puoi eseguire questa operazione nel modello, inserendo l'intero lotto nei tag {% autoescape off %}...{% endautoescape %} o tramite il filtro {{ myvar|safe }} su singole variabili. Oppure, puoi farlo nella vista, chiamando mark_safe(myvar) su singole variabili prima di passarle al modello.

+0

Grazie per la risposta. In realtà sto cercando di sfuggire al contenuto piuttosto che contrassegnarlo come sicuro. Ho pensato che il filtro sicuro significhi rendere i contenuti sicuri ... – user14412

12

Prima di tutto, dovresti sfuggire ai tuoi contenuti perché non sai mai (anche se sei l'unico a inserire i dati) se hai bisogno di caratteri speciali (come <,>,).

La sintassi da utilizzare mostrano sei a disagio con l'uso di sfuggire:

questo

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

è esattamente lo stesso di questo

{{ content|escape }} 

questo

{{ content }} 

è esattamente lo stesso di questo < - edit: Se l'autoescape è OFF (grazie a Paolo Scardine)

{{ content|safe }} 

sicuro è l'uso del genere:

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

'content' e' content | safe' saranno gli stessi se 'autoescape' è disattivato, che non è l'AFAIK predefinito. –

+0

Grazie! Pensavo che la sicurezza e la fuga fossero simili .. – user14412