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

时间:2011-01-08 03:19:18

标签: python string string-formatting

我使用字符串.format()函数来设置关键字参数的字符串格式。我将一些基本对象传递给字符串,并在字符串中使用这些对象的属性。例如:

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

这些字符串可能会在HTML电子邮件中使用,因此替换字段应进行HTML转义(使用django.utils.html.escape)。

格式化字符串时,为字符串替换字段使用转义函数的最佳方法是什么?如果这不合理,那么字符串格式的替代方法是什么?我的字符串存储在数据库中,并通过Django管理界面进行修改。

2 个答案:

答案 0 :(得分: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()}

如果你想让东西疯狂!

答案 1 :(得分: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函数显然需要替换)。