正如Martijn Pieters 所建议的(通过链接Flask 片段 28),也可以为它添加一个自定义过滤器。该链接已过时,因为不再提供Flask Snippets 。
因此,我将在此处提供来自网络存档的片段:
nl2br 过滤器
由 Dan Jacob 于 2010-06-17 @ 05:03 发布并归档于模板技巧
这是一个 nl2br(<BR> 的换行符)过滤器,改编自 Jinja2 示例:
http://jinja.pocoo.org/2/documentation/api#custom-filters
import re
from jinja2 import evalcontextfilter, Markup, escape
_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')
app = Flask(__name__)
@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
上面关于自定义过滤器的链接似乎也已经过时了。这是来自当前稳定版本 1.1 的类似链接:https ://flask.palletsprojects.com/en/1.1.x/templating/#registering-filters
我不太确定他为什么要使用如此复杂的结果计算。对我来说,以下代码有效,而且更简单。也许,如果您不使用autoescape
(我不想禁用),上面的变体会更好?!无论如何,现在两种变体都可用:
# custom_template_filters.py
from flask import Blueprint
from jinja2 import evalcontextfilter, Markup, escape
blueprint = Blueprint('custom_template_filters', __name__)
@evalcontextfilter
@blueprint.app_template_filter()
def newline_to_br(context, value: str) -> str:
result = "<br />".join(re.split(r'(?:\r\n|\r|\n){2,}', escape(value)))
if context.autoescape:
result = Markup(result)
return result
值得一提的是,来自 Dan Jacob 的代码片段使用了 Python2,并且我通过 Blueprint 运行了模板过滤器。为了完整起见,我还使用工厂方法提供了app.py :
# app.py
from flask import Flask
def create_app() -> Flask:
app = Flask(__name__)
...
register_template_filters(flask_app=app)
return app
def register_template_filters(flask_app: Flask) -> None:
from . import custom_template_filters
flask_app.register_blueprint(custom_template_filters.blueprint)
return None
它或多或少是一个实现细节,您将如何使上下文过滤器工作。主要思想是在函数内部nlbr
或newline_to_br
本身。如果您让自定义过滤器正常工作,它可以在您的所有 Jinja 模板中使用,您可以像这样使用它:
{{ anystring | newline_to_br }}