编程语言
首页 > 编程语言> > python-如何防止Django基本内联自动转义

python-如何防止Django基本内联自动转义

作者:互联网

Django Basic Inlines应用基于app / model / id组合从伪HTML语法呈现预定模板.例如,如果您正在撰写博客文章,则可以插入保存在图像模型中的图像:

# In the admin
This is the body of my post.

<inline type="media.image" id="1" class="full">

然后,模板采用render_inlines过滤器,该过滤器需要标记为安全,以便正确呈现HTML:

# Template
{{ post.body|render_inlines|safe }}

但是即使安全,过滤器仍会转义HTML,从而创建& lt; p& gt;& lt; img src =“ …”& lt; p& p在源中.

根据文档,过滤器应使用mark_safe来防止在过滤器级别自动转义,但parser.py中的内联函数已经使用mark_safe.

Django 1.4中是否还需要其他一些东西来停止在自定义滤镜层自动转义?我似乎无法摆脱这种自动转义,无论是在

> inlines function
> render_inlines function.

我尝试使用autoescape = None,这似乎也没有帮助.

解决方法:

我维护内联应用程序的a fork.理查德就此问题与我联系,我能够将其追溯到BeautifulSoup,而不是Django.

问题在于,BeautifulSoup的replaceWith()方法被用来将内联标记替换为呈现的模板.当然,render_to_string()的结果是一个字符串.当replaceWith()收到一个字符串时,它将变成NavigableString.由于BeautifulSoup期望NavigbleStrings是字符串,因此假定它们是不安全的,并且转义了任何HTML字符.结果是Inline的inlines()函数返回的值有一堆& gt;和& lt;而不是<和>.

我在Django 1.3中没有注意到这个问题.当我看时,BeautifulSoup确实返回了转义的HTML. Django的安全模板过滤器必须已经转义了先前转义的HTML.在Django 1.4中,它不再这样做. (它不应该这样做!)

我的解决方法是像以前一样,使用BeautifulSoup解析传入的值,并使用BeautifulSoup查找所有内联标记.而不是使用BeautifulSoup的replaceWith()方法用呈现的内联模板替换内联标记,我现在仅使用Python的普通旧str.replace().对我来说有点la脚,将解析的汤转换回字符串,然后进行字符串替换.但这有效.我有些想完全不使用BeautifulSoup并找到带有正则表达式但we all know how that ends的内联标记的想法.如果有人有更好的主意,我会很高兴!

该修补程序最初是在this commit中进行的.我在以下提交中对其进行了改进,但是显然StackOverflow仅允许我发布最多两个链接,因此您必须自己找到一个链接!

标签:django-template-filters,python,django,django-templates
来源: https://codeday.me/bug/20191011/1889901.html