Django 双重转义引号等
我遇到了一些我认为有点奇怪的情况。具体来说,如果我有这样一个字符串:
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('&','&').replace('<','<').replace('>', '>').replace('"', '"').replace("'",'''))
escape = allow_lazy(escape, unicode)
总之,看起来这个函数应该先转义&符号,这样就没问题了。所以我怀疑它可能被调用了两次。你有什么想法吗?
谢谢。
更新:我怀疑这可能和Ubuntu的Django有关,它显示为“1.0.2-1”,所以我安装了“1.0.2-final”,但问题依然存在。
2 个回答
哦,真是太搞笑了,
我真是傻,谷歌太聪明了,他们已经把我解析的XML里的那些特殊字符处理过了。想想看,我折腾了一个小时,结果发现又被谷歌给耍了!
附言:如果其他人遇到类似的问题,我指的是在做这种查询时返回的XML数据:http://books.google.com/books/feeds/volumes?q=1984,数据已经处理好了!不过,这让我有点紧张,因为如果我在模板里加上 |safe,万一我从其他不太信任的来源获取数据就麻烦了……总之,谢谢你们的阅读!
在1.0版本中,你不需要担心转义的问题。如果你有一个模板
<html>
<body>
& == & in HTML
</body>
</html>
它应该在打印之前把&
转成&
。
如果你有一个变量
<html>
<body>
{{ msg }}
</body>
</html>
并且
def view(request) :
msg = "& == & 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>