HTML-экранирование полей замены при использовании str.format () в Python - PullRequest
1 голос
/ 08 января 2011

Я использую функцию .format() для форматирования моих строк с аргументами ключевых слов. Я передаю некоторые базовые объекты в строки и использую атрибуты этих объектов в строках. Например:

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

Эти строки могут использоваться в электронных письмах HTML, поэтому поля замены должны быть экранированы (используя django.utils.html.escape).

Как лучше всего использовать escape-функцию для полей замены строк при форматировании строки? Если это невозможно, какова подходящая альтернатива форматированию строк? Мои строки хранятся в базе данных и изменяются через интерфейс администратора Django.

Ответы [ 2 ]

1 голос
/ 08 января 2011

Ну, вопрос в том, почему вы используете формат для начала. Разве вы не собираетесь выдвинуть это в шаблон? Я имею в виду, что если вы экранируете что-то в своем шаблоне (используя тег шаблона), вы просто передаете строку через эту escape-функцию.

Может быть, это не то, что вы ищете, но вы просто не сделаете,

"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()}

если ты хотел, чтобы что-то получилось CRAZY!

0 голосов
/ 18 января 2011

В качестве временного решения, прежде чем перейти к использованию шаблонов 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).

...