Jinja2過濾器的使用、控制語句示例詳解
1.過濾器的使用
1.過濾器和測試器
在Python中,如果需要對某個變量進行處理,我們可以通過函數來實現。在模板中,我們則是通過過濾器來實現的。過濾器本質上也是函數,但是在模板中使用的方式是通過管道符號(|)來調用的。例如有個字符串類型變量name,想要獲取他的長度,則可以通過 {name[length}}來獲取,Jinja2會把name當做第一個參數傳給length過濾器底層對應的函數。length是Jinja2內置好的過濾器,Jinja2中內置瞭許多好用過濾器,如果內置過濾器不滿足需求,我們還可以自定義過濾器。我們先來學習下如何自定義過濾器,讀者明白瞭過濾器的原理後,再去學習Jinja2內置過濾器就更能得心應手瞭。
2.過濾器
templates/filter.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>過濾器使用demo</title> </head> <body> {{ user.username}}-{{ user.username|length }} </body> </html>
app.py
# render_template 渲染模板 from flask import Flask, render_template app = Flask(__name__) class User: def __init__(self, username, email): self.username = username self.email = email @app.route("/filter") def filter_demo(): user = User(username="小程xxx", email="[email protected]") return render_template("filter.html",user=user) if __name__ == '__main__': app.run()
效果
3.自定義過濾器
過濾器本質上是 Python的函數,他會把被過濾的值當做第一個參數傳給這個函數,函數經過一些邏輯處理後,再返回新的值。在過濾器函數寫好後,可以通過@app.template_ filter裝飾器或者是app.add_template_filter函數來把函數註冊成Jinja2能用的過濾器。這裡我們以註冊一個時間格式化的過濾器為例,來說明下自定義過濾器的方法。
app.py
# render_template 渲染模板 from flask import Flask, render_template from datetime import datetime app = Flask(__name__) # strftime:根據區域設置格式化本地時間 # format:格式化 def datetime_format(value,format="%Y年%m月%d日 %H:%m"): return value.strftime(format) app.add_template_filter(datetime_format,"dformat") class User: def __init__(self, username, email): self.username = username self.email = email # filter:過濾器 @app.route("/filter") def filter_demo(): user = User(username="小程xxx", email="[email protected]") mytime=datetime.now() return render_template("filter.html",user=user,mytime=mytime) if __name__ == '__main__': app.run()
上面我們定義瞭一個datetime_formt的函數,第一個參數是需要被處理的值,第二個參數是時間的格式,並且指定瞭一個默認值。然後下面通過app.add_template_filter,將datetime_format函數註冊成瞭過濾器,並且這個過濾器的名字,叫做dformat。那麼以後在模板文件中,就可以這樣類似這樣使用瞭:
templates/filter.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>過濾器使用demo</title> </head> <body> <div>{{ user.username}}-{{ user.username|length }}</div> <div>{{ mytime|dformat }}</div> </body> </html>
效果
2.控制語句
1.if
app.py
# render_template 渲染模板 from flask import Flask, render_template app = Flask(__name__) @app.route("/control") def control_statement(): age=17 return render_template("control.html",age=age) if __name__ == '__main__': app.run()
templates/control.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% if age>18 %} <div>您已經滿118歲,可以進入網吧!</div> {% elif age==18 %} <div>您剛滿18歲,需要父母陪同才能進入!</div> {% else %} <div>您未滿18歲,不能進入網吧!</div> {% endif %} </body> </html>
註:
- 可以註意到if語句結束後,需要加一個endif來關閉if代碼塊。這個跟python是有點不同的。
- Jinja2中的代碼縮進隻是為瞭更加方便閱讀。任何縮進都不是必須的。
2.for
app.py
# render_template 渲染模板 from flask import Flask, render_template app = Flask(__name__) @app.route("/control") def control_statement(): age = 17 books = [{ "name": "三國演義", "author": "羅貫中" },{ "name": "水滸傳", "author": "施耐庵" } ] return render_template("control.html", age=age,books=books) if __name__ == '__main__': app.run()
templates/control.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for book in books %} <div>圖書名稱:{{ book.name }},圖書作者:{{ book.author }}</div> {% endfor %} </body> </html>
推薦閱讀:
- Python Flask入門之模板
- python jinja2模板的使用示例
- Python3+Flask安裝使用教程詳解
- Flask登錄註冊項目的簡單實現
- Python Flask 請求數據獲取響應詳解