flask之jinjia2模板语言

flask_jinjia2.py

 1 '''
 2 flask中的jinjia2模板语言(和django中模板类似):
 3     (1)模板变量{{ }}
 4 
 5     (2)模板标签{% %}
 6         ①for循环遍历
 7             {% for foo in  %}
 8                 ......
 9             {% endfor %}
10         ②if...else判断
11             {% if %}
12                 ...
13             {% elif %}
14                ...
15             {% else %}
16                 ...
17             {% endif %}
18     (3)模板继承{% extends  html文件 %},配合模板中定义的block重写需要改动的部分
19         {% extends 'base.html' %}
20         {% block 模板中块名 %}
21             ......
22         {% endblock %}
23 
24     (4)模板组件{% include html文件 %}在页面中引入html组件
25 
26     (5)通过后端特殊装饰器定义函数在模板中直接时候用
27         ①@app.template_global()装饰的函数直接以模板变量函数调用方式使用,如{{ sum(1,2) }}
28         ②@app.template_filter()装饰的函数直接以模板变量过滤器形式使用,第一个参数自动为变量,如{{ 1 | sum2(2,3,4) }}
29 
30     (6)jinjia2模板语言中的宏定义
31           在模板中先定义:
32             {% macro  定义宏(形参,形参...)   %}
33                 html标签使用参数
34             {% endmacro %}
35 
36           在模板中使用定义的宏:
37             {{ 宏(实参,实参...) }}
38 
39         实例:
40         <div>
41             {% macro type_text(name,type) %}
42             <input type="{{ type }}" name="{{ name }}" value="{{ name }}">
43             {% endmacro %}
44 
45             {{ type_text("one","text") }}
46             {{ type_text("two","text") }}
47         </div>
48 
49     (7)模板过滤器safe及flask中的Markup使用
50         返回html标签可以在模板中使用过滤器safe确保安全正常渲染成标签
51         也可以在后端flask项目中通过Markup()实例化之后记性渲染
52 
53 '''
54 
55 from flask import Flask, render_template,Markup
56 
57 app = Flask(__name__)
58 
59 STUDENT = {'name': 'Old', 'age': 38, 'gender': ''},
60 
61 STUDENT_LIST = [
62     {'name': 'Old', 'age': 38, 'gender': ''},
63     {'name': 'Boy', 'age': 73, 'gender': ''},
64     {'name': 'EDU', 'age': 84, 'gender': ''}
65 ]
66 
67 STUDENT_DICT = {
68     1: {'name': 'Old', 'age': 38, 'gender': ''},
69     2: {'name': 'Boy', 'age': 73, 'gender': ''},
70     3: {'name': 'EDU', 'age': 84, 'gender': ''},
71 }
72 
73 
74 # 模板变量和标签使用以及Markup()返回标签
75 @app.route('/jinjia2')
76 def data():
77     title='<h2>后端Markup()返回的标签</h2>'
78     markup_title=Markup(title)
79     return render_template('jinjia2daemo.html', st=STUDENT, stl=STUDENT_LIST, std=STUDENT_DICT,title=markup_title)
80     # return render_template('jinjia2daemo.html',**{'st':STUDENT,'stl':STUDENT_LIST,'std':STUDENT_DICT})
81 
82 
83 # 特殊装饰器函数在模板中的全局使用
84 @app.template_global()
85 def sum1(a, b):
86     return a + b
87 
88 @app.template_filter()
89 def sum2(a, b, c, d):  # 第一个参数为模板变量
90     return a + b + c + d
91 
92 
93 
94 if __name__ == '__main__':
95     app.run(debug=True)

 

jinjia2daemo.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>data</title>
 6 </head>
 7 <body>
 8 
 9 
10 <div>{{ title }}</div>
11 
12 <!--单个模板变量使用-->
13 <div>
14     <h2>单个学生</h2> {{ st }}
15 </div>
16 <!--模板标签for/if使用-->
17 <div>
18     <h2>列表嵌套字典数据</h2> {{ stl }}
19     <table border="1px">
20         <tr>
21             <td>name</td>
22             <td>age</td>
23             <td>gender</td>
24         </tr>
25         {% for obj in stl %}
26             <tr>
27                 <td>{{ obj.name }}</td>
28                 <td>{{ obj.age }}</td>
29                 <td>
30                     {% if obj.gender in ['男','女'] %}
31                         {{ obj.gender }}
32                     {% else %}
33                         '男'
34                     {% endif %}
35                 </td>
36             </tr>
37         {% endfor %}
38     </table>
39 </div>
40 
41 <div>
42     <h2>字典嵌套字典数据</h2> {{ stl }}
43     <table border="1px">
44         <tr>
45             <td>id</td>
46             <td>name</td>
47             <td>age</td>
48             <td>gender</td>
49         </tr>
50         {% for id,data in std.items() %}
51             <tr>
52                 <td>{{ id }}</td>
53                 <td>{{ data.name }}</td>
54                 <td>{{ data.age }}</td>
55                 <td>
56                     {% if data.gender in ['男','女'] %}
57                         {{ data.gender }}
58                     {% else %}
59                         '男'
60                     {% endif %}
61                 </td>
62             </tr>
63         {% endfor %}
64     </table>
65 </div>
66 
67 
68 <div>
69     <h2>特殊装饰器自定义的函数直接在模板中使用</h2>
70     {{ sum1(1,2) }}
71     <br>
72     {{ 1 | sum2(2,3,4) }}
73 </div>
74 
75 
76 <!--jinjia2模板语言中的宏定义-->
77 <div>
78     <h2>jinjia2模板语言中的宏定义</h2>
79     <div>
80             {% macro type_text(name,type) %}
81             <input type="{{ type }}" name="{{ name }}" value="{{ name }}">
82             {% endmacro %}
83 
84             {{ type_text("one","text") }}
85             {{ type_text("two","text") }}
86         </div>
87 </div>
88 
89 
90 
91 
92 </body>
93 </html>

 

posted @ 2019-07-12 17:10  笑得好美  阅读(884)  评论(1编辑  收藏  举报