web-dev-qa-db-fra.com

Django échappement du modèle

Le système de gabarit de Django fournit quelques options (filtres) pour échapper au contenu en html, mais elles sont un peu déroutantes pour moi en tant que débutant. Supposons que je suive un didacticiel pour créer un blog simple et que le contenu du blog doit être échappé - je fais confiance au contenu car je suis le seul à le modifier. La question est donc de savoir si je dois le faire comme {{ post.content|autoescape }}, {{ post.content|escape }}, ou {{ post.content|safe }} en html?

Merci

EDIT: Quel filtre dois-je utiliser pour convertir automatiquement les caractères spéciaux en entités html?

EDIT 2: Je viens de réaliser que l'auto-évasion n'est pas un filtre valide.

32
user14412

L'échappement HTML est activé par défaut dans les modèles Django.

Autoescape est une balise. pas un filtre:

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

Le filtre 'd'échappement' échappe au HTML d'une chaîne. Plus précisément, il effectue ces remplacements:

  • <est converti en &lt;
  • > est converti en &gt;
  • '(guillemet simple) est converti en &#39;
  • "(guillemet double) est converti en &quot;
  • & est converti en &amp;

Le "force_escape" est presque identique à "escape" à l'exception de quelques cas d'angle.

Le filtre "sûr" marquera votre contenu comme sûr, il ne sera donc pas échappé (sera envoyé au navigateur tel quel).

Quel filtre dois-je utiliser pour convertir automatiquement les caractères spéciaux en entités html?

Vous voulez dire, comme convertir à à &Atilde;? Restez fidèle à l'encodage utf-8 et oubliez-les.

45
Paulo Scardine

tout d'abord, vous devez échapper à votre contenu car vous ne savez jamais (même si vous êtes celui qui saisit les données) si vous allez avoir besoin d'un caractère spécial (comme <,>,).

La syntaxe que vous utilisez montre que vous n'êtes pas à l'aise avec l'utilisation de l'échappement:

cette

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

est exactement le même que celui-ci

{{ content|escape }}

cette

{{ content }}

est exactement la même chose que ceci

{{ content|safe }} 

Coffre-fort est utilisé comme ça:

{% autoescape on %}
    {{ content }}  <-- escape
    {{ content|safe }}  <-- not escape
{% endautoescape %}
22
BlueMagma

Votre question montre que vous êtes un peu confus sur ce qu'est la fuite.

L'échappement transforme des caractères non sûrs - comme les balises HTML - en versions échappées afin que le contenu malveillant tel que les balises de script ne ruine pas votre site. Django fait cela par défaut sur tout le contenu rendu dans un modèle à partir d'une variable.

Il semble que d'après votre commentaire, vous êtes le seul à modifier votre contenu, ce que vous voulez, c'est rendre vos variables sans l'échappement automatique. Donc, pour cela, vous devez le marquer comme sûr. Vous pouvez soit le faire dans le modèle, soit en enveloppant le lot entier dans des balises {% autoescape off %}...{% endautoescape %} Ou via le filtre {{ myvar|safe }} Sur des variables individuelles. Ou, vous pouvez le faire dans la vue, en appelant mark_safe(myvar) sur des variables individuelles avant de les passer au modèle.

9
Daniel Roseman

Pour éviter de s'échapper, utilisez "safe" ( https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe ):

Marque une chaîne comme ne nécessitant pas d'échappement HTML supplémentaire avant la sortie. Lorsque l'échappement automatique est désactivé, ce filtre n'a aucun effet.

Pour échapper, utilisez "escape" ( https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape ):

Échappe le code HTML d'une chaîne.

0
Tadeck