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>