4

私は現在、以下のようにdjangoテンプレートフィルターを使用して変数をエスケープしようとしています。djangoのプライマリテンプレートエンジンの代わりにjinja2テンプレートエンジンを使用しています

{{ my_variable|escape|linebreaks }}

改行を含む文字列の出力は次のとおりです。

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

理想的には

<br />

「改行」フィルターによって追加されるため、エスケープすることは想定されていません。元の文字列の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>

テンプレートフィルターの適用で何か問題があったかどうか、および/または正しい方向に私を向けることができるかどうかを誰かが知っていますか?

ありがとう。

4

2 に答える 2

5

linebreaksでは、jinja2テンプレートでdjangoのフィルターを使用していますか?その場合、djangoが文字列セーフをマークする方法はjinja2と互換性がない可能性があるため、djangoによって追加されたタグをエスケープします(autoescapeがアクティブな場合)。

jinja2から最後にセーフフィルターを追加した場合はどうなりますか?

{{ my_variable|escape|linebreaks|safe }}

それ以外の場合は、djangoの改行に似ているように見えるカスタムフィルターの例がjinja2ドキュメントにあります。 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
于 2011-02-04T18:51:51.420 に答える
2

愚かな私、私は使用できるようです:

{{ my_variable|forceescape|linebreaks }}

'escape'フィルターを最初に適用するように強制します。デフォルトでは、「escape」は位置に関係なく他のすべてのフィルターの最後にのみ適用されるため、force_escapeは他の最も単純な代替手段です。

于 2011-02-05T04:15:17.680 に答える