Django 双重转义引号等

1 投票
2 回答
4251 浏览
提问于 2025-04-15 13:02

我遇到了一些我认为有点奇怪的情况。具体来说,如果我有这样一个字符串:

1984: 课程单元
作者:唐纳德·R·霍格,学习中心,乔治·奥威尔

“一个学习中心的出版物”--封面。

在Django模板系统自动转义后,结果变成了这样:

1984: 课程单元
作者:唐纳德·R·霍格,学习中心,乔治·奥威尔

"一个学习中心的出版物"--封面。

问题似乎在于,原本应该变成"的引号(")被转义了两次,结果变成了&"。这导致格式看起来很奇怪。我使用的是Django 1.0.2,应该是最新的(不过我得提一下,我用的是Ubuntu 9.04自带的python-django包),但这种行为似乎和预期的不太一样。

我稍微看了一下django.utils.html.py,这里面有实际的函数:

def escape(html):

"""返回给定的HTML,并对&、引号和尖括号进行编码。"""

return mark_safe(force_unicode(html).replace('&','&amp;').replace('<','&lt;').replace('>', '&gt;').replace('"', '&quot;').replace("'",'&#39;'))

escape = allow_lazy(escape, unicode)

总之,看起来这个函数应该先转义&符号,这样就没问题了。所以我怀疑它可能被调用了两次。你有什么想法吗?

谢谢。

更新:我怀疑这可能和Ubuntu的Django有关,它显示为“1.0.2-1”,所以我安装了“1.0.2-final”,但问题依然存在。

2 个回答

1

哦,真是太搞笑了,

我真是傻,谷歌太聪明了,他们已经把我解析的XML里的那些特殊字符处理过了。想想看,我折腾了一个小时,结果发现又被谷歌给耍了!

附言:如果其他人遇到类似的问题,我指的是在做这种查询时返回的XML数据:http://books.google.com/books/feeds/volumes?q=1984,数据已经处理好了!不过,这让我有点紧张,因为如果我在模板里加上 |safe,万一我从其他不太信任的来源获取数据就麻烦了……总之,谢谢你们的阅读!

1

在1.0版本中,你不需要担心转义的问题。如果你有一个模板

<html>
 <body>
  & == &amp; in HTML
 </body>
</html>

它应该在打印之前把&转成&amp;

如果你有一个变量

<html>
 <body>
  {{ msg }}
 </body>
</html>

并且

def view(request) :
  msg = "& == &amp; in HTML"

也应该以同样的方式打印出来。

你只有在需要直接粘贴原始html的时候,才需要自己进行编码。比如:

def view(request) :
  msg = '<img src="http://example.com/pretty.jpg" />This picture is very pretty'

然后在你的模板中

<html>
 <body>
  {{ msg|safe }}
 </body>
</html>

撰写回答