结合使用Django和html编辑器,对文本进行编解码

时间:2019-02-01 10:55:31

标签: django django-templates django-database quil

我正在使用编辑器Quill在Django中接收数据,数据的格式为HTML。

当我推入数据库时​​,以及当我检索返回HTML时,是否可以对数据进行编码/清理?如果是,怎么办?

我也只使用段落,列表和
(这是由编辑器传递的),但是我想检查用户是否没有在代码中添加其他内容。

例如:

我从编辑那里得到

<li>fdsafdsafdsa</li><li>fdsafdafsdafds</li>

在数据库中,我想另存为(现在我另存为html):

&lt;li&gt;fdsafdsa&lt;/li&gt;&lt;li&gt;fdsafdsa&lt;/li

当我返回页面时,我会发回:

<li>fdsafdsafdsa</li><li>fdsafdafsdafds</li>

2 个答案:

答案 0 :(得分:2)

您可以将html保存在数据库中的文本字段中。

class UserGeneratedHtml(models.Model)
    html = models.TextField()

然后在保存此数据之前,请确保它实际上是有效的html。您可以使用类似BeautifulSoup的html解析器进行此操作:

from bs4 import BeautifulSoup
html = """<html>
<head><title>I'm title</title></head>
</html>"""
non_html = "This is not an html"
bool(BeautifulSoup(html, "html.parser").find())
True
bool(BeautifulSoup(non_html, "html.parser").find())
False

此代码段检查字符串内是否有任何html元素。related answer to the snipplet above

当然,保存和提供用户生成的html总是很棘手,甚至可能很危险,因此您应始终确保html不包含可能危险的内容。您可以使用BeautifulSoup解析生成的html,如果它包含除段落和列表以外的内容,则拒绝它。

如果要在模板中呈现用户生成的html,则可以像下面这样简单地呈现它:

{{ html |safe }}

答案 1 :(得分:1)

我最终决定像这样使用漂白剂包Mozilla:

value = bleach.clean(value, tags=['p', 'ul', 'ol', 'li', 'br'])