Как предотвратить автоматический выход в шаблонах Django? - PullRequest
12 голосов
/ 08 января 2012

В документах написано:

Единственными исключениями являются переменные, которые уже помечены как «безопасные» для экранирования, либо кодом, который заполнил переменную, либо потому, что он имел безопасныйили применены экранирующие фильтры. "

Как работает часть" Заполненная переменная "? Я на самом деле ищу способ объявить тег шаблона безопасным в представлении. Я почему-то думаю, что это не такхорошая идея, чтобы дизайнер решил. Моя коллега будет добавлять ее всякий раз, когда она «думает», что это хорошая идея.

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

Ответы [ 2 ]

22 голосов
/ 08 января 2012

Django имеет подкласс строк, называемый safe strings (в частности, SafeUnicode или SafeString), который может быть создан с использованием django.utils.safestring.mark_safe.Когда механизм шаблонов сталкивается с безопасной строкой, он не выполняет экранирование HTML:

>>> from django.utils.safestring import mark_safe
>>> from django.template import Template, Context
>>> Template("{{ name }}").render(Context({'name': mark_safe('<b>Brad</b>')}))
u"<b>Brad</b>"

Если вы пишете свой собственный тег шаблона, вам нужно реализовать render(), который будет возвращать строкуэто будет считаться безопасным, что означает, что вы должны справиться с любым побегом, необходимым вам.Однако, если вы пишете шаблонный фильтр, вы можете установить атрибут is_safe = True в фильтре, чтобы избежать автоматического экранирования возвращаемого значения, например,

@register.filter
def myfilter(value):
    return value
myfilter.is_safe = True

Подробнее см. https://docs.djangoproject.com/en/1.3/howto/custom-template-tags/#filters-and-auto-escaping.

5 голосов
/ 08 января 2012

Вы можете позвонить django.utils.safestring.mark_safe и передать вам переменную

...
return direct_to_template('my-template.html', {'safe_var': mark_safe('<script>alert("");</script>')})

В шаблоне она будет напечатана без экранирования (всплывет предупреждение).Хотя автоматический выход действительно отличная функция, которая избавит вас от некоторых неприятностей.

...