Flask模板
Flask可以以HTML形式返回綁定到某個URL的函數的輸出。 例如,在以下腳本中,hello()
函數將使用附加的<h1>
標記呈現‘Hello World’ 。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<html><body><h1>'Hello World'</h1></body></html>'
if __name__ == '__main__':
app.run(debug = True)
但是,從Python代碼生成HTML內容非常麻煩,尤其是在需要放置可變數據和Python語言元素(如條件或循環)時。經常需要轉義HTML代碼。
它可以利用Jinja2模板引擎技術,而不需要從函數返回硬編碼HTML。如下代碼所示,可以通過render_template()
函數渲染HTML文件。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return render_template(‘hello.html’)
if __name__ == '__main__':
app.run(debug = True)
Flask將嘗試在該腳本所在的同一文件夾中查找templates
文件夾中的HTML文件。使用模板的應用程序目錄結構如下所示 -
app.py
hello.py
templates
hello.html
register.html
....
術語「Web模板系統」是指設計一個HTML腳本,其中可以動態插入變量數據。 Web模板系統由模板引擎,某種數據源和模板處理器組成。
Flask使用jinga2模板引擎。 Web模板包含用於變量和表達式(這些情況下爲Python表達式)的HTML語法散佈佔位符,這些變量和表達式在模板呈現時被替換爲值。
以下代碼在模板(templates)文件夾中保存爲:hello.html。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask HTTP請求方法處理</title>
</head>
<body>
<h1>Hello {{ name }}!</h1>
</body>
</html>
接下來,將以下代碼保存在app.py文件中,並從Python shell運行 -
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello/<user>')
def hello_name(user):
return render_template('hello.html', name = user)
if __name__ == '__main__':
app.run(debug = True)
在開發服務器開始運行時,打開瀏覽器並輸入URL爲 - http://localhost:5000/hello/maxsu
URL的可變部分插入{{name}}
佔位符處。
Jinja2模板引擎使用以下分隔符來從HTML轉義。
-
{% ... %}
用於多行語句 -
{{ ... }}
用於將表達式打印輸出到模板 -
{# ... #}
用於未包含在模板輸出中的註釋 -
# ... ##
用於單行語句
在以下示例中,演示了在模板中使用條件語句。 hello()
函數的URL規則接受整數參數。 它傳遞給hello.html
模板。 在它裏面,收到的數字(標記)的值被比較(大於或小於50),因此在HTML執行了有條件渲染輸出。
Python腳本如下 -
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello/<int:score>')
def hello_name(score):
return render_template('hello.html', marks = score)
if __name__ == '__main__':
app.run(debug = True)
模板文件:hello.html 的HTML模板腳本如下 -
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask模板示例</title>
</head>
<body>
{% if marks>50 %}
<h1> 通過考試!</h1>
{% else %}
<h1>未通過考試!</h1>
{% endif %}
</body>
</html>
請注意,條件語句if-else
和endif
包含在分隔符{%..。%}
中。
運行Python腳本並訪問URL=> http://localhost/hello/60
,然後訪問 http://localhost/hello/59
,以有條件地查看HTML輸出。
Python循環結構也可以在模板內部使用。 在以下腳本中,當在瀏覽器中打開URL => http:// localhost:5000/result
時,result()
函數將字典對象發送到模板文件:results.html 。
result.html 的模板部分採用for循環將字典對象result{}
的鍵和值對呈現爲HTML表格的單元格。
從Python shell運行以下代碼。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/result')
def result():
dict = {'phy':59,'che':60,'maths':90}
return render_template('result.html', result = dict)
if __name__ == '__main__':
app.run(debug = True)
將以下HTML腳本保存爲模板文件夾(templates)中的模板文件:result.html 。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask模板示例</title>
</head>
<body>
<table border = 1>
{% for key, value in result.items() %}
<tr>
<th> {{ key }} </th>
<td> {{ value }} </td>
</tr>
{% endfor %}
</table>
</body>
</html>
在這裏,與For循環相對應的Python語句包含在{%...%}
中,而表達式鍵和值放在{{}}
中。
開發開始運行後,在瀏覽器中打開http://localhost:5000/result
以獲得以下輸出。