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