1. jinja2
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
jinja2中文文档:http://docs.jinkan.org/docs/jinja2/index.html
首先我们要在后端定义几个示例,用于传递到前端显示
STUDENT = {'name': '苏格拉底', 'saying': '认识你自己', 'explain': '如果人们能够通过自我审查和反省认识到他们当前的生活是缺乏道德的和盲目的,那么他们就会去寻找并渴望道德理想'},
STUDENT_LIST = [
{'name': '毕达哥拉斯', 'saying': '数学', 'explain': '数是宇宙的真正奥秘和组成部分'},
{'name': '柏拉图', 'saying': '那些爱肉体更甚于爱灵魂的庸俗的情侣是不好的', 'explain': '被后人误解为男女之间纯灵魂的柏拉图之恋,其实真实指的是同性恋'},
{'name': '亚里士多德', 'saying': '逻辑学', 'explain': '心理学考察人的思维的真实过程,而逻辑学是教导人们应该如何去正确思维,以便于人们获得科学的认识'}
]
STUDENT_DICT = {
1: {'name': '爱迪生', 'saying': '灯泡', 'explain': '99%'},
2: {'name': '特斯拉', 'saying': '克隆机', 'explain': '《致命的魔术》'},
3: {'name': '居里夫人', 'saying': '镭', 'explain': '诺贝尔奖'},
}
msg = '爱默生:人不仅要远离社会,还需远离书房,方可进入孤独的境界。'
2. 变量
应用把变量传递到模板,你可能在模板中弄混。变量上面也可以有你能访问的属性或元 素。变量看起来是什么,完全取决于应用提供了什么。
后端:
@app.route("/",methods=('get','post'))
def test():
return render_template('index.html',msg = msg}
前端:
{{ msg }}
你可以使用点( . )来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法( [] )。下面的几行效果是一样的:
后端:
@app.route("/",methods=('get','post'))
def test():
return render_template('index.html',stu= STUDENT }
前端:
{{ stu }}
{{stu[0].name}}
{{{stu[0].get('saying')}}
{{{stu[0]['explain']}}
如果变量或属性不存在,会返回一个未定义值。你可以对这类值做什么取决于应用的配 置,默认的行为是它如果被打印,其求值为一个空字符串,并且你可以迭代它,但其它 操作会失败。
3. 流程控制
控制结构指的是所有的那些可以控制程序流的东西 —— 条件(比如 if/elif/ekse )、 for 循环、以及宏和块之类的东西。控制结构在默认语法中以 {% … %} 块的形式 出现。
for循环
遍历序列中的每项。例如,要显示一个由 stu_list 与stu_dict 变量提供的学者列表和学者字典:
后端:
@app.route("/",methods=('get','post'))
def test():
return render_template('index.html',stu_list= STUDENT_LIST,stu_dict=STUDENT_DICT }
前端:
{% for stu_l in stu_list %}
<tr>
<td>{{ stu_l.get("name") }}</td>
<td>{{ stu_l.saying }} </td>
<td>{{ stu_l["explain"] }}</td>
</tr>
{% endfor %}
<td>{{ stu_list.2.name }}</td>
{% for id,stu in std_dict.items() %}
<tr>
<td>{{ id }}</td>
<td>{{ stu.get("name") }}</td>
<td>{{ stu.saying }}</td>
<td>{{ stu["explain"] }}</td>
</tr>
{% endfor %}
在一个 for 循环块中你可以访问这些特殊的变量:
变量 | 描述 |
---|---|
loop.index | 当前循环迭代的次数(从 1 开始) |
loop.index0 | 当前循环迭代的次数(从 0 开始) |
loop.revindex | 到循环结束需要迭代的次数(从 1 开始) |
loop.revindex0 | 到循环结束需要迭代的次数(从 0 开始) |
loop.first | 如果是第一次迭代,为 True |
loop.last | 如果是最后一次迭代,为 True) |
loop.length | 序列中的项目数 |
loop.cycle | 在一串序列间期取值的辅助函数 |
if判断
Jinja 中的 if 语句可比 Python 中的 if 语句。在最简单的形式中,你可以测试 一个变量是否未定义,为空或 false:
{% if stu_list.0['age'] %}
<h2>有这个名字</h2>
{% elif stu_list.0['saying'] %}
<h2>有他的名言</h2>
{% else %}
<h2>没有这个人</h2>
{% endif %}
macro宏函数
宏类似常规编程语言中的函数。它们用于把常用行为作为可重用的函数,取代 手动重复的工作。
这里是一个宏渲染表单元素的小例子:
{% macro input(name, value='', type='text', size=20) -%}
<input type="{{ type }}" name="{{ name }}" value="{{
value|e }}" size="{{ size }}">
{%- endmacro %}
在命名空间中,宏之后可以像函数一样调用:
<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
4. 其它传递
html标签
后端:
#第一种
tag = '<h1>伟大诞生自平凡</h1>'
# 第二种
from flask import Markup # 导入 flask 中的 Markup 模块
tag = Markup('<h1>伟大诞生自平凡</h1>')
前端:
# 第一种
{{tag | safe}} # 加上管道符 |safe
# 第二种
{{tag}}
函数
后端:
#定义一个函数,把它传递给前端
def ab_sum(a,b):
return a+b
tag = ab_sum
前端:
{{ tag }}
<br>
{{ tag(99,1) }}
全局函数
后端:
@app.template_global() # 定义全局模板函数
def ab_sum(a, b):
return a + b
@app.template_filter() # 定义全局模板函数
def abc_sum(a, b, c):
return a + b + c
前端:
{{ ab_sum(99,1) }}
<br>
{{ 10 | abc_sum(197,2) }}
5. 模板继承
Jinja 中最强大的部分就是模板继承。模板继承允许你构建一个包含你站点共同元素的基本模板“骨架”,并定义子模板可以覆盖的块 。
与Django类似,具体可参考之前的文章,这里不再赘述
更多可参考jinjia2模板设计者文档:http://docs.jinkan.org/docs/jinja2/templates.html#id18