启用 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>
如果字符串中遇到[s]
,存储在 custom_markup_text 中,则应将其转换为<strong>
标记。 AFAIK, Markup()函数可确保我们信任此特定字符串,以便HTML不会在那里进行转义。已成功应用过滤器,[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
我做错了什么?
答案 0 :(得分:1)
发现问题。它是双重逃避字符串 - 相当愚蠢。 这段代码完美无缺:
@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属性。