3

autoescapeプロパティをオンにして (そのままにしておきたい)、ユーザーがカスタム マークアップを入力して、テキストを書式設定できるようにしたいと考えています。たとえば、[s][/s]に変換され<strong></strong>ます。これを行う正しい方法は、カスタムの Jinja2 フィルターを作成することだと思います。しかし、以下は機能しません。

@app.template_filter()
@evalcontextfilter
def mark2html(eval_ctx, value):
    result = escape(value).replace('[s]','<strong>')
    if eval_ctx.autoescape:
        result = Markup(result)
    return result

のようなテキストに適用すると

<div>{{ custom_markup_text|mark2html }}</div>

custom_markup_text[s]に格納されている文字列内で が検出された場合は、タグに変換する必要があります。私の知る限り、Markup()関数は、この特定の文字列を信頼することを保証するため、HTML はそこでエスケープされません。フィルタが正常に適用され、に置き換えられましたが、まだエスケープされています。<strong>[s]<strong>

明らかに、このカスタム フィルターの後に自動エスケープが行われます。一方、Jinja2 ドキュメントのサンプル フィルターは完全に機能します。

@app.template_filter()
@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

私は何を間違っていますか?

4

1 に答える 1

2

問題が見つかりました。文字列を二重にエスケープしています-かなりばかげています。このコードは問題なく動作します:

@app.template_filter()
@evalcontextfilter
def mark2html(eval_ctx, value):
    result = value.replace('[s]',u'<strong>')
    result = result.replace('[/s]',u'</strong>')
    if eval_ctx.autoescape:
        result = Markup(result)
    return result

autoescape プロパティがオンになっているため、値をエスケープしないでください。

于 2012-06-04T09:06:15.420 に答える