在Python中使用str.format()时对HTML转义替代字段

1 投票
2 回答
1580 浏览
提问于 2025-04-16 09:36

我正在使用字符串的 .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()}

如果你想让事情变得疯狂起来!

撰写回答