Django Retourner de l'html

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous et à toutes :) ,

j’ai la version de Django 1.11.6.

j’ai une classe Post qui possède un champs : "content" dans lequel se trouve le contenu d’un article. Il peut contenir de l’HTML et j’aimerais bien afficher celui-ci dans ma template. J’ai vu qu’il y avait une fonction format_html() qui permettait d’éviter que Django convertisse les balises html en texte, mais je ne comprends pas comment l’utiliser. Pouvez-vous m’expliquer comment l’utiliser ou comment empecher que django convertisse l’html de content en texte ?

Merci d’avance

Si je n’ai pas été clair, n’hésitez pas à me le dire ^^

+0 -0

Tu dois ajouter le flag safe dans ton template : {{ content |safe }}

Mais attention, si le contenu de content est issu d’une entrée utilisateur tu t’exposes aux failles XSS si tu ne sanitize pas le contenu.

J’ai déjà fait ça une fois quand j’ai codé un forum en django, j’avais fait une fonction par laquelle le contenu passe (dans la view) avant de partir dans le template :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import bleach
from urllib.parse import urlparse

def sanitize_html(content):
    def filter_iframe_src(name, value):
        if name in ('width', 'height', 'frameborder', 'allowfullscreen'):
            return True
        elif name == 'src':
            p = urlparse(value)
            return (not p.netloc) or p.netloc == 'youtube.com' or p.netloc == 'www.youtube.com'
        else:
            return False

    return bleach.clean(content,
        tags=['iframe', 'a', 'abbr', 'acronym', 'address', 'area', 'b', 'bdo', 'big', 'blockquote', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'map', 'menu', 'ol', 'optgroup', 'option', 'p', 'pre', 'q', 's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'u', 'tr', 'tt', 'u', 'ul', 'var'],
        attributes={
            '*': ['class', 'id', 'style'],
            'iframe': filter_iframe_src,
            'a': ['href'],
            'font': ['color', 'face', 'size'],
            'img': ['align', 'alt', 'height', 'src', 'title', 'width'],
        },
        styles=['color', 'text-align', 'background-color']
    )

Ca permet de n’autoriser que certaines balises, certains arguments et certaines valeurs pour les arguments, et d’échapper le reste. Ce qui permet d’être XSS-safe. J’avais fait un truc spécial pour iframe, pour autoriser l’inclusion de vidéos youtube (et uniquement ça).

En espérant que ça puisse t’aider. ;)

Merci beaucoup,

j’ai réutilisé ton code mais j’ai du mal à la comprendre en effet quand je rajoute une vidéo youtube dans le content, j’ai l’erreur suivante :

filter_iframe_src() takes 2 positional arguments but 3 were given

Je ne comprends pas quel est l’argument qui passe en trop ?

Hm quand j’ai écrit ce code bleach était en version 1.4, maintenant il est en 2.1, y’a peut-être eu des petits changements. ;)

filter_iframe_src est appelée par bleach lorsqu’il rencontre une iframe, afin de voir quels attributs sont autorisés.

http://bleach.readthedocs.io/en/latest/clean.html#using-functions

Ils le disent dans la doc : Changed in version 2.0: In previous versions of Bleach, the callable took an attribute name and a attribute value. Now it takes a tag, an attribute name and an attribute value.

Rajoute un paramètre tag en première position dans la fonction, même si tu ne l’utilises pas, et ça marchera. ;)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte