Python 如何应用django/jinja2模板过滤器';逃逸';和';换行符';正确地

Python 如何应用django/jinja2模板过滤器';逃逸';和';换行符';正确地,python,html,django,django-templates,jinja2,Python,Html,Django,Django Templates,Jinja2,我目前正在尝试使用django模板过滤器转义一个变量,如下所示。 我使用jinja2模板引擎,而不仅仅是django的主模板引擎 {{ my_variable|escape|linebreaks }} 带换行符的字符串的输出如下所示: Lorem ipsum <br /> dolor sit amet <br />rg srg gs rgsr rsg serg<br />r srg 但是,结果更糟: <p>Lorem ipsum <br

我目前正在尝试使用django模板过滤器转义一个变量,如下所示。 我使用jinja2模板引擎,而不仅仅是django的主模板引擎

{{ my_variable|escape|linebreaks }}
带换行符的字符串的输出如下所示:

Lorem ipsum <br /> dolor sit amet <br />rg srg
gs rgsr rsg serg<br />r srg
但是,结果更糟:

<p>Lorem ipsum <br /> dolor sit amet <br />rg srg</p>
<p>gs rgsr rsg serg<br />r srg</p>
Lorem ipsum
dolor sit amet
rg srg

gs rgsr rsg serg
r srg

有人知道我是否在应用模板过滤器时出错,和/或是否能够为我指出正确的方向吗


谢谢。

那么您在jinja2模板中使用django的
换行符
过滤器了?在这种情况下,我假设django标记字符串安全的方式可能与jinja2不兼容,因此转义django添加的标记(如果autoescape处于活动状态)

如果你把金甲2号的安全过滤器加在最后呢

{{ my_variable|escape|linebreaks|safe }}
另外,jinja2文档中有一个自定义过滤器的示例,它似乎类似于django的换行符。

重新导入
从jinja2导入evalcontextfilter、标记、转义
_段落_re=re.compile(r'(?:\r\n |\r |\n){2,}')
@evalcontextfilter
def nl2br(评估ctx,数值):
结果=u'\n\n'。加入(u'%s

'%p.replace('\n','
\n')) 对于段落中的p,关于拆分(转义(值))) 如果eval_ctx.autoescape: 结果=标记(结果) 返回结果
我真傻,看来我可以用:

{{ my_variable|forceescape|linebreaks }}
强制首先应用“退出”筛选器。
默认情况下,“escape”仅适用于所有其他过滤器的末尾,而不管其位置如何,因此强制escape是另一个最简单的选择。

感谢您为我指出jinja2自定义过滤器。虽然这是一个更复杂的解决方案,但它帮助我解决了一个相关的问题,即实现自定义筛选器来为urlize链接执行target=“\u blank”。谢谢@VKen您介意共享target=“\u blank”urlize代码吗?我一直在寻找一种实现该功能的方法。我最终不得不做
{{my_variable | escape | linebreaks | safe}}
(正如@Reiner所建议的那样)只是为我做
forceescape
双重转义。
{{ my_variable|escape|linebreaks|safe }}
import re
from jinja2 import evalcontextfilter, Markup, escape

_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')

@evalcontextfilter
def nl2br(eval_ctx, value):
    result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n')
                      for p in _paragraph_re.split(escape(value)))
    if eval_ctx.autoescape:
        result = Markup(result)
    return result
{{ my_variable|forceescape|linebreaks }}