前言
在以前前后端不分離的時代,后台程序員往往又當爹又當媽,需要將前端程序員寫的h5頁面填充模板語言。而jijia2是一門十分強大的python的模板語言,是flask框架的核心模塊之一。先簡單介紹一下jijia2模板的用法。
系列文章
變量
模板可以說是直接展示給客戶端的,那么在模板中有視圖函數傳遞給模板的普通變量和可以直接使用的全局變量。
普通變量
- 變量的語法結構
<p>{{ bianliang }}</p> # 模板中的變量
{% if bianliang > 3 %} # 用來執行賦值或條件或判斷語句
{# said something #} # 注釋
- 變量對象的屬性查找
bar.per # 先查找bar對象是否有per屬性,再查找是否有per對象(如字典中的鍵值對);
bar['per'] # 先查找是否有per對象(如字典中的鍵值對),再查找bar對象是否有per屬性;
# 如果沒有找到,則返回未定義對象,默認用空字符串替代;
- 變量的來源
# render_template
render_template函數會模板和傳遞的變量值進行組裝
# 自定義的兩個變量名context和message可以在模板中使用
render_template('sleeps/sleep.html',context=users,message=data)
# render_template_string方法也可以傳遞變量名
render_template_string('<p>OK</p><p>OK</p>', name='aaaa')
全局變量
即不需要顯性的傳遞,可以直接使用的變量
- request
# 通過request可以直接獲取相關的屬性
{{request.args}}
-
session
-
g
-
配置對象config
-
url_for()
過濾器
過濾器的使用方式為:變量名 | 過濾器。如:{{ 'aaa' | safe | lower}}
全局常用過濾器
default:如果該變量未定義或找不到,使用默認的值;
length:獲取字符串,列表,元組,字典的長度
random(seq):從序列中返回一個隨機項;
replace(value,old,new,count=None):將old替換為new的字符串,count設置替換的次數;
對數字的操作
abs:返回一個數字的絕對值;
round:四舍五入取整;
round(2,'floor'):截取小數點后兩位;'floor'向下截取,'ceil'向上截取,'common'四舍五入,默認的;
int(value):將值轉換為int類型。
float(value):將值轉換為float類型。
groupby(value, attribute):分組;
reverse:將迭代器反轉;
select,selectattr:對序列中進行過濾,返回判斷為True的元素組成的列表;
reject,rejectattr:對序列中進行過濾,返回判斷為False的元素組成的列表;
對變量的字符串操作
safe:禁用轉義;
string(value):將變量轉換成字符串。
list(value):將值轉換成列表
urlize:將文本的url轉換成可點擊的鏈接;urlize(5):將這個鏈接縮短為顯示指定的長度5;
wordcount(s):計算一個長字符串中單詞的個數
capitalize:把變量值的首字母轉成大寫,其余字母轉小寫;
truncate(value,length=255,killwords=False):截取length長度的字符串。
lower:把值轉成小寫;
upper:把值轉成大寫;
title:把值中的每個單詞的首字母都轉成大寫;適用於一句話;
trim:把值的首尾空格去掉;
format:格式化輸出;如: <p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML標簽都刪掉;
escape:轉義字符,會將<、>等符號轉義成HTML中的符號。
wordwrap(s, width=79, break_long_words=True, wrapstring=None):將字符串分成指定長度一份,如{{ 'http://www.baidu.com' | wordwrap(9)}}
對列表的操作
first:取列表的第一個元素,如:{{ [1,2,3,4,5,6] | first }}
last:取最后一個元素
sum:列表求和,如果不能計算會報錯;
sort:列表排序,默認按升序排列;
batch:對列表分組,形成二維列表,如:{{ [1,2,3,4,5] | batch(2,'ff') }},2個元素一組,不足的使用'ff‘替代;
join:拼接列表中的元素;如:{{ [1,2,3,4,5] | join('&&') }};
upper,lower:將列表中所有的字符串改變大小寫;
slice:切片,返回二維列表,slice(2)設置步長
對字典的操作
dictsort(value, case_sensitive=False, by='key'):按鍵的首字母順序排序,並生成列表;
如:{{ {'name':'xx','age':'23'} | dictsort }},結果:[('name',"xx"),('age','23')]
sort:排序;
{{ {'name':'xx','age':'23'} | sort(attribute='age', reverse=true) }} # 按指定的字段,降序排列,默認升序;
attr:獲取對象的屬性;如:{{ {'name':'xx','age':'23'} | attr('age') }}
map(value,attribute):提取值中的某一項組成一個列表;如:{{context| map(attribute='age')}},age組成一個字典;
調試
pprint(value, verbose=False):輸出一個變量;
不常用的過濾器
filesizeformat(value, binary=False):將值格式化成文件的大小,如4.1 MB, 102 Bytes等;如果binary=True則為二進制;
自定義過濾器
注意:自定義的過濾器名稱如果和內置的過濾器重名,會覆蓋內置的過濾器。
方法一:
過濾器其實是一個函數,可以自定義一個函數,然后通過flask的add_template_filter將我們的函數加入到過濾器表單中;
import app
def funcx(ls):
return ls+3
app.add_template_filter(funcx,'add_3') # 第一個參數為函數的名字,第二個參數為過濾器的名字;
方法二:
使用template_filter函數和裝飾器的方式實現;
import app
@app.template_filter('add_3')
def funcx(ls):
return ls+3
全局函數
全局函數是任意函數,可以在任一場景使用,沒有輸入和輸出值的限制。其變量相當於python中的全局變量;
使用方式:
{% set sep = joiner("|") %} # 定義一個全局變量
常用函數
range([start], stop[, step]):和python中的range的用法完全一樣;
dict():傳入鍵值對,可以生成字典;
joiner():可以初始化為一個分隔符,然后第一次調用時返回空字符串,以后再調用則返回分隔符。對分隔循環中的內容很有幫助
cycler():這是一個類,周期計允許你在若干個值中循環,傳入多個值,在多個值中循環;
# cycler有三個函數
reset():重置周期計到第一個項。
next():返回當前項並跳轉到下一個。
current:返回當前項。
lipsum(n=5, html=True, min=20, max=100):在模板中生成 lorem ipsum 亂數假文。默認會生成 5 段 HTML ,每段在 20 到 100 詞之間。用來測試;
自定義全局函數
- 使用add_template_global函數;
# 注冊全局函數
app.add_template_global(funcx,'add_3')
# 使用裝飾器
@app.template_global('add_3')
def funcx(ls):
return ls+3