带有漂白剂的Flask和Jinja2,图片HTML无效

时间:2015-05-07 15:31:35

标签: python html flask markdown jinja2

我为自己创建了一个项目的小博客,只有我作为用户才能访问发布页面。我之前一直在关注Flask教程,其最终产品使您能够发布HTML并使用漂白和Markdown将其传递给Jinja2模板。

在我的models.py文件中,这些是允许的标记。

@staticmethod

def on_changed_body(target, value, oldvalue, initiator):
    allowed_tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code',
                    'em', 'i', 'li', 'ol', 'pre', 'strong', 'ul',
                    'h1', 'h2', 'h3', 'p', 'img', 'video', 'div', 'iframe', 'p', 'br', 'span', 'hr', 'src', 'class']
    target.body_html = bleach.linkify(bleach.clean(
        markdown(value, output_format='html'),
        tags=allowed_tags, strip=False))

我添加了一些img和embedding标签,因为这些对我的博客很重要。我有一个由一些文本和一个图像组成的示例文章,它正在保存到(SQLAlchemy MySQL)数据库,正是我编写它的方式。以下是直接从数据库中获取的。

<p>Hello</p>

<img src="https://catastrophicfindings.files.wordpress.com/2012/07/moomin-childhood-memories-260482_829_494.jpg">

<marquee>Bye</marquee>

此外,我的博客帖子表单下方有一个字段,显示HTML的预览。图像显示为预期,因此我知道这很好,<marquee></marquee>标记显示为标记。

在我的模板文件中,我这样传递这个body_html。

{% if post.body_html %}
    {{ post.body_html | safe }}
{% else %}
    {{ post.body }}
{% endif %}

当我在浏览器中导航到帖子时,图像根本不显示。但是,字幕标记显示为<marquee>Bye</marquee>,并且在开发人员控制台中进一步检查时,HTML中会显示<img>标记,只是没有&#39; src&#39;属性。

有什么方法可以解决这个问题吗?这会是Jinja的配置吗?有没有办法声明允许的属性,如果这是解决方案?

谢谢。

1 个答案:

答案 0 :(得分:5)

更多的耐心和一些谷歌搜索证明是富有成效的,直接来自bleach docs

  

属性kwarg是属性的白名单。它可以是一个列表,在这种情况下,任何标签或字典都允许使用属性,在这种情况下,键是标签名称(或通配符:*表示所有标签),值是允许属性的列表。

所以,我在models.py中的bleach.clean函数中添加了一个所需属性的字典:

 @staticmethod
    def on_changed_body(target, value, oldvalue, initiator):
        allowed_tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code',
                        'em', 'i', 'li', 'ol', 'pre', 'strong', 'ul',
                        'h1', 'h2', 'h3', 'p', 'img', 'video', 'div', 'iframe', 'p', 'br', 'span', 'hr', 'src', 'class']
        allowed_attrs = {'*': ['class'],
                        'a': ['href', 'rel'],
                        'img': ['src', 'alt']}
        target.body_html = bleach.linkify(bleach.clean(
            markdown(value, output_format='html'),
            tags=allowed_tags, strip=False, attributes=allowed_attrs))

这非常有效。我将调整它以适应嵌入。