flask模板技术---转义

Jinja自动根据模板语法进行html渲染,但某些时候,我们不希望它进行渲染,原因在于一旦渲染,其结果并不是我们所期望的,比如下面这段html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>使用jinjia模板,变量需要被两对大括号括起来,例如: {{ name }}</p>
</body>
</html>

我所期望的是,当用户打开浏览器时,在页面里看到如下的内容

使用jinjia模板,变量需要被两对大括号括起来,例如: {{ name }}

下面是app.py里的代码

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/', methods=['GET'])
def name():
    return render_template('template.html')


if __name__ == '__main__':
    app.run(port=5500, debug=True)

运行app.py以后,访问http://127.0.0.1:5500/,得到的结果竟然是

使用jinjia模板,变量需要被两对大括号括起来,例如:

我想要的 不见了,这是因为jinja在渲染时把这段视为表达式进行了渲染,而由于后端并没有提供name参数,因此渲染的结果就是什么都没有。

我的本意并不是在模板里渲染name,而是在页面里展示如何声明一个可以被渲染的变量,但jinjia不能明白我的本意,毕竟我没有任何额外的信息给它,这种写法就应当传递name参数进行渲染。

一个巧妙的解决办法是这样的

<p>使用jinjia模板,变量需要被两对大括号括起来,例如: {{ '{{' }} name }}</p>

我将原本的两个左大括号用单引号括起来,表明它是一个字符串,然后外层再套两对大括号,jinja就会将其视为一个表达式进行渲染,这种做大破坏了之前的表达式,使其不再构成一个可渲染的表达式。

更好的办法是把整个表达式都处理成字符串

<p>使用jinjia模板,变量需要被两对大括号括起来,例如: {{ '{{ name }}' }}</p>

对于单个表达式,用上面的办法非常凑效,但对于大的段落,如果想暂时禁用jinjia进行渲染,需要使用{% raw %} 和 {% endraw %}

{% raw %}
    <ul>
    {% for item in seq %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
{% endraw %}

假设你现在就想在页面里展示这段模板里使用for循环的代码,显然你不希望它被jinjia渲染,那么就可以用 进行标记,在它与 之间的html代码将不会被jinja渲染。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案