本篇文章主要介紹模板的使用。
0.什么是模板
上篇敲的代碼,業(yè)務(wù)邏輯和界面邏輯混雜在一塊,不好理解和維護(hù)。為了讓業(yè)務(wù)邏輯和界面邏輯分開,引入了模板這一概念。
模板是一個包含響應(yīng)文本的文件,其中包含用占位變量表示的動態(tài)部分,其具體值只在請求的上下文中才能知道。
渲染:使用真實(shí)值替換變量,再返回最終得到的響應(yīng)字符串,這一過程稱為渲染。
為了渲染模板,F(xiàn)lask使用了一個名為Jinja2的強(qiáng)大模塊引擎。
1.舉個簡單栗子
0.前提
創(chuàng)建虛擬環(huán)境
激活虛擬環(huán)境
安裝flask
1.創(chuàng)建一個app.py文件,寫入:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/user/<name>')
def user(name):
return render_template('user.html',user=name)
if __name__ == '__main__':
app.run(debug=True)
解釋下:
from flask import Flask,render_template這句話,除了引入了Flask,還引入了render_template。Flask 提供的
render_template函數(shù)把Jinja2模板集成到了程序中。
render_template函數(shù),第1個參數(shù)是模板的文件名。隨后的參數(shù)都是鍵值對,表示模板中變量對應(yīng)的真實(shí)值。
render_template('user.html',user=name)user.html表示模板文件名,第2個參數(shù):user=name中user表示模板中的變量,name表示當(dāng)前函數(shù)user(name)參數(shù)。
2.在app.py文件下創(chuàng)建同級別的templates文件夾
這里需要注明下必須是templates文件夾。默認(rèn)情況下,F(xiàn)lask在程序文件夾中的templates子文件夾中尋找模板。
3.在templates文件夾下創(chuàng)建user.html,寫入:
{% if user %}
<h1>Hello {{ user }}!</h1>
{% else %}
<h1>Hello stranger!</h1>
{% endif %}
解釋下:
{{ user }}結(jié)構(gòu)表示一個變量,它是一個特殊的占位符,告訴模板引擎這個位置的值從渲染。
{% if user %}結(jié)構(gòu),我理解的時表示一種邏輯,記住除了變量{{name}}外都用這個。
4.運(yùn)行
python app.py
在瀏覽器中輸入:http://localhost:5000/user/Tom,得到結(jié)果:Hello Tom!
2.控制結(jié)構(gòu)
0.if else控制結(jié)構(gòu)
{% if user %}
<h1>Hello {{ user }}!</h1>
{% else %}
<h1>Hello stranger!</h1>
{% endif %}
1.for循環(huán)
<ul>
{% for name in names %}
<li>{{ name }}</li>
{% endfor %}
</ul>
解釋下:
names是個數(shù)組變量如:[tom,sam,jim]
2.宏
{% macro render_name(name) %}
<li>{{ name }}</li>
{% endmacro %}
<ul>
{% for name in names %}
{{ render_name(name) }}
{% endfor %}
</ul>
解釋下:
什么是宏,聽起來挺嚇人的。這里的宏類似于Python代碼中的函數(shù)。
{% macro render_name(name) %}定義一個render_name宏
{{ render_name(name) }}調(diào)用這個宏 注意是{{ }}結(jié)構(gòu)
3.模板繼承
先看下代碼:
0.創(chuàng)建一個base.html
<html>
<head>
{% block head %}
<title>{% block title %}{% endblock %} —— 一個簡單Demo</title>
{% endblock %}
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
1.創(chuàng)建一個page.html 繼承 base.html
{% extends 'base.html' %}
{% block title %} 測試下 {% endblock %}
{% block head %}
{{ super() }}
<style></style>
{% endblock %}
{% block body %}
<h1>hello world</h1>
{% endblock %}
解釋下:
什么是模板繼承?它類似于Python代碼中的類繼承。
base.html為基模板。定義了名為head、title和body的塊。注意,title包含在head中。
page.html為衍生模板。{% extends 'base.html' %}衍生自base.html注意定義的head塊,在基模板中其內(nèi)容不是空的,所以使用```{{ super() }}``獲取原先的內(nèi)容。
OK,這就是所謂的模板。說些題外話:學(xué)習(xí)一門語言,自認(rèn)為會默寫就OK啦,這和將學(xué)到的東西整理成一篇文章,完全是兩碼事。