2011-01-08 94 views
1

我使用字符串.format()函數來使用關鍵字參數來格式化字符串。我將一些基本對象傳遞給字符串,並在字符串中使用這些對象的屬性。例如:在Python中使用str.format()時HTML轉義替換字段

"Hello, {user.first_name}!".format(user=my_user) 

這些串可以在HTML電子郵件中使用,因此在更換字段應爲(使用django.utils.html.escape)HTML轉義。

格式化字符串時使用字符串替換字段的轉義函數的最佳方式是什麼?如果這不合理可行,什麼是字符串格式的合適替代方法?我的字符串正在存儲在數據庫中,並通過Django管理界面進行修改。

回答

1

那麼,問題是你爲什麼要使用格式開始。你不打算推這個模板?我的意思是,如果你在你的模板中使用模板標籤逃避某些事情,那麼你幾乎只是通過這個逃逸函數傳遞一個字符串。

也許這是不是你在找什麼,但你我就不會只是做,

"Hello, {user.first_name}!".format(user=django.utils.html.escape(my_user)) 

如果你想逃避所有的論點和你確信他們會 字符串,

def foo(**kwargs): 
    for key,val in kwargs.iteritems(): 
     kwargs[key] = django.utils.html.escape(val) 

    ... 

你也很可能做一些更瘋狂的喜歡,

def foo(**kwargs): 
    kwargs = dict((key, val) for key,val in izip(kwargs.iterkeys(), \ 
    map(django.utils.htmls.escape, kwargs.itervalues()))) 

    # OR if you use Python 3 
    kwargs = {key:django.utils.htmls.escape(val) for key, val in kwargs.items()} 

,如果你想要的東西得到瘋狂!

+0

我實際上使用`.format()`來代替當前的模板(這些用於格式化電子郵件)。 kwargs轉義方法也不適用於我的情況,因爲它會自己將參數轉義(將它們轉換爲字符串),因此像'{user.first_name}'這樣的表達式將不起作用,因爲'user'將是一個字符串。 – 2011-01-08 08:57:38

0

作爲在使用Django模板之前的臨時解決方案,我在documentation中提到了string.Formatter的子類。

import string 
from django.utils.html import escape 

class EscapingFormatter(string.Formatter): 
    def format_field(self, value, format_spec): 
     return escape(super(EscapingFormatter, self).format_field(value, format_spec)) 

formatter = EscapingFormatter() 
formatter.format("Hello, {user.first_name}!", user=my_user) 

這個解決方案應該Django的外部工作,以及(在escape功能顯然需要但被替換)。