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>