在Python中使用str.format()时对HTML转义替代字段
我正在使用字符串的 .format()
函数来格式化我的字符串,使用的是关键字参数。我把一些基本的对象传递给字符串,并在字符串中使用这些对象的属性。例如:
"Hello, {user.first_name}!".format(user=my_user)
这些字符串可能会用在HTML电子邮件中,所以替换的字段需要进行HTML转义(也就是用 django.utils.html.escape
来处理)。
在格式化字符串时,使用转义函数来处理替换字段的最佳方法是什么?如果这样做不太可行,那么有什么合适的替代方案来进行字符串格式化?我的字符串是存储在数据库里的,并通过Django的管理界面进行修改。
2 个回答
0
在我开始使用Django模板之前,作为一个临时解决方案,我创建了一个叫做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
函数显然需要替换成其他的)。
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()}
如果你想让事情变得疯狂起来!