1. 程式人生 > 其它 >flask的基本使用3,jinja2模板

flask的基本使用3,jinja2模板

jinja2模板引擎簡介
1,模板
檢視函式的主要作用是生成請求的響應,這是最簡單的請求。實際上,檢視函式有

兩個作用:
處理業務邏輯和返回響應內容。在大型應用中,把業務邏輯和表現內容放在一起,會增加
程式碼的複雜度和維護成本。模板的作用即是承擔檢視函式的另一個作用,即返回響應內容。
模板其實是多個包含響應指令碼的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的
值需要從使用的資料中獲取
使用真實值替換變數,再返回最終得到的字串,這個過程稱為“渲染”
Flask是使用 Jinja2 這個模板引擎來渲染模板

使用模板的好處:
檢視函式只負責業務邏輯和資料處理(業務邏輯展示),模板則取到檢視函式的資料結果進行展示(檢視展示展示)程式碼結構清晰,耦合度低

Jinja2的兩個概念:
Jinja2:是 Python flask下個被廣泛應使用的模板引擎,是由Python實現的模板語言,他的設計思想來
源於 Django 的模板引擎,並擴充套件了其語法和本系列強大的功能,其是Flask內建的模板語言。
模板語言:是一種被設計來自動生成文件的簡單文字格式,在模板語言中,一般都會把某些變數傳給模板,替換模板的特定位置上預先定義好的佔位變數名。
渲染模版函式
Flask提供的 render_template 函式封裝了該模板引擎
render_template 函式的第一個引數是模板的檔名,後面的引數都是鍵值對,表示模板中變數
對應的真實值。

使用
{{}} 來表示變數名,這種 {{}} 語法叫做變數程式碼塊

<h1>{{ post.title }}</h1>

Jinja2 模版中的變數程式碼塊可以是任意 Python 型別或者物件,只要它能夠被 Python 的 str() 用法轉換為單個字串就可以,比如,可以通過面的方式顯示單個字典或者列表中的某個元素:  

{{your_dict['key']}}
{{your_list[0]}}

用 {%%} 定義的控制程式碼塊,可以實現某些語言層次的功能,比如迴圈或者if語句  

{% if user %}
{{ user }}
{% else %}
hello!
<ul>
{% for index in indexs %}
<li> {{ index }} </li>
{% endfor %}
</ul>

註釋

使⽤用{# #} 進行註釋,註釋的內容不會在html中被渲染出來

{# {{ name }} #}

2,模板變數

2.1 模板變數的基本使用

模板渲染的三步操作

from flask import Flask, render_template

app = Flask(__name__)
# 模板渲染的三步操作
# 1,將模板檔案放入模板資料夾中,並設定模板語言
# 2,使用render_template進行模板渲染,將要替換的內容設定為模板變數
# 3,在模板檔案中使用模板變數替換內容(找到要替換內容設定為{{模板變數名}})


@app.route('/')
def index():
    city_name = '北京'
    htm_str = render_template('baidu.html',city=city_name)
    return htm_str


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

2.2模板替換

py程式碼
from flask import Flask, render_template

app = Flask(__name__)
class User():
    type='vip'
    def is_login(self):
        return True

@app.route('/')
def index():
    name = 'zs'
    dict = {
        'name': 'ls',
        'age': 18
    }
    list = [1, 2, 3, 4]
    htm_str = render_template('render.html',name=name,dict=dict,list=list,user=User())
    return htm_str


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

html程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<label>{{ name }}</label><br/>
<label>{{ dict }}</label><br/>
<label>{{ dict['name'] }}</label><br/>
<label>{{ dict.name }}</label><br/> 
<label>{{ list }}</label><br/>
<label>{{ list[0] }}</label><br/>
<label>{{ user.type }}</label><br/>
<label>{{ user.is_login }}</label><br/>

</body>
</html>

2.3過濾器

py程式碼 

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    name = 'zs'
    list = [1, 6, 3, 9]
    h1_tag='<h1>我是標題<h1>'
    htm_str = render_template('filtering.html',name=name,list=list,h1_tag=h1_tag)
    return htm_str


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

html程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<label>{{ name|lower }}</label><br/>
<label>{{ list|first }}</label><br/>
<label>{{ list|sum }}</label><br/>
<label>{{ h1_tag|safe }}</label><br/>

{#過濾塊程式碼#}
{% filter upper %}
    hello<br/>
    world
{% endfilter %}

</body>
</html>

2.4自定義過濾器

1.定義過濾器函式>1定義形參接收模板變數的值,>2將轉換後的結果返回
2.應用新增過濾器 add_template_filter(過濾器函式引用,過濾器名稱)  

py程式碼

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    list = [1,4,9,8,2]
    htm_str = render_template('filtering1.html',list=list )
    return htm_str

# 1.定義過濾器函式>1定義形參接收模板變數的值,>2將轉換後的結果返回
def li_reverse(var):
    return var[::-1]

# 2.應用新增過濾器 add_template_filter(過濾器函式引用,過濾器名稱)
app.add_template_filter(li_reverse,'Li_reverse')
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

html程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<label>{{ list|Li_reverse }}</label><br/>


</body>
</html>