2009-07-21 65 views
1

我正在體驗我會認爲有些奇怪的行爲。具體來說,如果我有一個這樣的字符串:Django Double Escaping Quotes etc

1984年:課程單位
由Donald R.霍格,中心學習,喬治·奧威爾

「用於學習出版中心」 - 封面。

這將導致以下通過Django模板系統被自動轉義後:

1984年:課程單位
由Donald 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;'))

逃逸= allow_lazy(逃生,Unicode)的

無論如何,看起來它應該在其他任何事情之前逃脫&,這很好。所以我的懷疑是它被稱爲兩次。有什麼想法嗎?

謝謝。

更新:我很懷疑它可能與Ubuntu的Django有關,它被列爲「1.0.2-1」,因此我安裝了「1.0.2-final」,並且遇到了同樣的問題。

回答

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> 
+0

這是我期望的行爲,但這不是我所得到的。例如,你在上面說msg =「&== & in HTML」我會得到這樣的東西:「& & == & & amp; in HTML」就是說,它執行一次轉義,然後轉義&在逃脫的結果。儘管如此,感謝您的及時迴應! – philipk 2009-07-21 08:00:38

1

哦苦命哈日哈日,

我傻,谷歌是非常聰明,他們已經逃走的字符在我解析XML。難道你不知道嗎,一小時的擺弄只是爲了實現Google再次勝出我!

P.S.如果有人遇到過類似的問題,我特別指的是在執行這種查詢時返回的XML:http://books.google.com/books/feeds/volumes?q=1984,數據已經爲您逃過了!話雖如此,但確實讓我有點頭痛,因爲在我的模板中放置安全意味着,如果我從其他來源獲得的數據我不太信任......無論如何,感謝您的閱讀!