一饿凛、jinja2過(guò)濾器
- 1.內(nèi)置過(guò)濾器
變量可以通過(guò) 過(guò)濾器 修改窟却。過(guò)濾器與變量用管道符號(hào)( | )分割遇汞,并且也 可以用圓括號(hào)傳遞可選參數(shù)未妹。多個(gè)過(guò)濾器可以鏈?zhǔn)秸{(diào)用,前一個(gè)過(guò)濾器的輸出會(huì)被作為 后一個(gè)過(guò)濾器的輸入空入。使用方法:{{ 變量名|過(guò)濾器名("參數(shù)") }}
過(guò)濾器 | 說(shuō)明 |
---|---|
abs | 返回一個(gè)數(shù)值的絕對(duì)值 |
default | 當(dāng)前變量沒(méi)有值則返回默認(rèn)值络它,boolean=True當(dāng)變量有值但是值為False(空字符串,空列表执庐,空字典)時(shí)返回默認(rèn)值 |
safe | 可以關(guān)閉一個(gè)字符串的自動(dòng)轉(zhuǎn)義, 禁用轉(zhuǎn)義 |
escape | 對(duì)某一個(gè)字符串進(jìn)行轉(zhuǎn)義 |
first | 返回一個(gè)序列的第一個(gè)元素 |
last | 返回最后一個(gè)值 |
format | 格式化字符串 |
length | 返回一個(gè)序列類型的長(zhǎng)度 |
join | 將一個(gè)序列酪耕,用指定的參數(shù)拼接成字符串 |
int | 將值轉(zhuǎn)換為 int 類型 |
float | 將值轉(zhuǎn)換為 float 類型 |
lower | 將字符串轉(zhuǎn)換為小寫 |
upper | 將字符串轉(zhuǎn)換為大寫 |
string | 將變量轉(zhuǎn)換為字符串 |
replace | 替換字符串replace('原字符串', '新字符串') |
truncate | 截取指定長(zhǎng)度的字符串truncate(length=8) |
striptags | 刪除字符串中所有的HTML標(biāo)簽,如果出現(xiàn)多個(gè)空格轨淌,將替換成一個(gè)空格 |
trle | 截取字符串前面和后面的空白字符 |
wordcount | 計(jì)算一個(gè)長(zhǎng)字符串中單詞的個(gè)數(shù) |
title | 把值中的第個(gè)單詞的首頁(yè)字母變成大寫 |
captalize | 把變量值的首字母轉(zhuǎn)成大寫迂烁,其余字母轉(zhuǎn)小寫 |
trim | 把值的首尾空格去掉 |
reverse | 字符串的反轉(zhuǎn) |
sum | 列表求和 |
sort | 列表排序 |
- 2.自定義過(guò)濾器
過(guò)濾器的本質(zhì)就是函數(shù),如果在模板中調(diào)用這個(gè)過(guò)濾器递鹉,那么就會(huì)將這個(gè)變量的值作為第一個(gè)參數(shù)傳給過(guò)濾器函數(shù)盟步,然后將函數(shù)的返回值作為濾器的返回值, 在python文件中寫好過(guò)濾的函數(shù)和邏輯躏结,將函數(shù)注冊(cè)到模板過(guò)濾器中:@app.template_filter('過(guò)濾器名')却盘,在模板中調(diào)用過(guò)濾器:變量|過(guò)濾器名。
@app.template_filter('my_filter')
def add_unit(data, unit)
data = str(data)+unit
return data
在模板中使用:
<p>{{ data|my_filter('%') }}</p>
<p>{{ age|my_filter('歲')}}</p>
二媳拴、控制語(yǔ)句
所有的控制語(yǔ)句都是放在{% ... %}中黄橘,并且有?個(gè)語(yǔ)句{% endxxx %}來(lái)進(jìn)?結(jié)束,Jinja中常?的控制語(yǔ)句有if/for..in..
- 1.if控制語(yǔ)句
新建一個(gè)app.py實(shí)例文件屈溉,代碼如下:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/if/')
def if_control():
contest = {
'name': 'zhangsan',
'age': 20
}
return render_template('if.html', **contest)
if __name__ == '__main__':
app.run(debug=True)
新建一個(gè)if.html文件塞关,代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>if控制語(yǔ)句</title>
</head>
<body>
{% if name %} // 判斷name變量是否為真,注意這里變量無(wú)需通過(guò){{ 變量名 }}的方式來(lái)表示
<p><b>您好子巾,{{ name }}帆赢!</b></p>
{% endif %}
{% if age >= 18 %} // 判斷age變量是否大于18
<p><b>成年人</b></p>
{% else %}
<p><b>未成年人</b></p>
{% endif %}
</body>
</html>
- 2.for控制語(yǔ)句的裝載
新建一個(gè)app.py實(shí)例文件,代碼如下:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/for/')
def for_control():
contest = {
'books': [
{
'name': '三國(guó)演義',
'author': '羅貫中',
'price': 70
},
{
'name': '西游記',
'author': '吳承恩',
'price': 70
},
{
'name': '紅樓夢(mèng)',
'author': '曹雪芹',
'price': 70
},
{
'name': '水滸傳',
'author': '施耐庵',
'price': 70
}
]
}
return render_template('for.html', **contest)
if __name__ == '__main__':
app.run(debug=True)
新建一個(gè)for.html文件线梗,代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for控制語(yǔ)句</title>
</head>
<body>
<table>
<tr>
<th>書名</th>
<th>作者</th>
<th>價(jià)格</th>
</tr>
{% for book in books %}
<tr>
{% for value in book.values() %}
<td>{{ value }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</body>
</html>
并且Jinja2中的for循環(huán)還包含以下變量椰于,可以?來(lái)獲取當(dāng)前的遍歷狀態(tài)。
變量 | 描述 |
---|---|
loop.index | 當(dāng)前迭代的索引(從1開(kāi)始) |
loop.index0 | 當(dāng)前迭代的索引(從0開(kāi)始) |
loop.first | 是否是第?次迭代仪搔,返回True或False |
loop.last | 是否是最后?次迭代瘾婿,返回True或False |
loop.length | 序列的?度 |
另外,不可以使?continue和break表達(dá)式來(lái)控制循環(huán)的執(zhí)?。
三憋他、宏和import
- 宏的簡(jiǎn)介
宏類似常規(guī)編程語(yǔ)言中的函數(shù)孩饼。它們用于把常用行為作為可重用的函數(shù)髓削,取代 手動(dòng)重復(fù)的工作竹挡。如果宏在不同的模板中定義,你需要首先使用 import立膛,比如:
{% macro input(name, value='', type='text', size=20) -%}
<input type="{{ type }}" name="{{ name }}" value="{{
value|e }}" size="{{ size }}">
{%- endmacro %}
在命名空間中揪罕,宏之后可以像函數(shù)一樣調(diào)用:
<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
- 宏的導(dǎo)入import
定義一個(gè)宏文件macros.html。
<!--宏模板文件-->
<!--macros.html-->
{% macro input(name="",value="", type="text") %}
<!--value加變量參數(shù)-->
<input type="{{type}}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
導(dǎo)入方式有如下幾種:
{% import "macros.html" as macros %}
{% from "macros.html" import input %}
{% from "macros.html" import input as macros %}
另外需要注意的是宝泵,導(dǎo)?模板并不會(huì)把當(dāng)前上下?中的變量添加到被導(dǎo)?的模板中好啰,如果你想要導(dǎo)??個(gè)需要訪問(wèn)當(dāng)前上下?變量的宏,有兩種可能的?法顯式地傳?請(qǐng)求或請(qǐng)求對(duì)象的屬性作為宏的參數(shù)與上下??起(with context)導(dǎo)?宏儿奶。
{% import "macros.html" as macros with context %}