簡體   English   中英

如何正確應用django / jinja2模板過濾器'escape'和'linebreaks'?

[英]How to apply django/jinja2 template filters 'escape' and 'linebreaks' correctly?

我正在嘗試使用django模板過濾器來逃避變量,如下所示。 我使用jinja2模板引擎而不僅僅是django的主要模板引擎

{{ my_variable|escape|linebreaks }}

帶換行符的字符串輸出如下:

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

理想情況下

<br />

不應該被轉義,因為它是由“linebreaks”過濾器添加的。 原始字符串沒有html標簽。

我試過了:

{{ my_variable|linebreaks|escape }}

但是,結果更糟:

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

有誰知道我是否在應用模板過濾器時出錯了,並且/或者能夠指出我正確的方向?

謝謝。

所以你在jinja2模板中使用django的linebreaks過濾器? 在這種情況下,我會假設django標記字符串安全的方式可能與jinja2不兼容,因此轉義django添加的標記(如果autoescape處於活動狀態)。

如果你從jinja2添加安全過濾器到底怎么辦?

{{ my_variable|escape|linebreaks|safe }}

否則,jinja2文檔中的自定義過濾器有一個示例,似乎與django的換行符類似。 http://jinja.pocoo.org/docs/api/#custom-filters

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 }}

強制首先應用'escape'過濾器。 默認情況下,'escape'僅應用於所有其他過濾器的末尾,盡管有位置,因此force_escape是另一個最簡單的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM