用 Flask 來寫個輕博客 (10) — M(V)C_Jinja 經常使用過濾器與 Flask 特殊變量及方法

Blog 項目源碼:https://github.com/JmilkFan/JmilkFan-s-Blogpython

目錄

前文列表

用 Flask 來寫個輕博客 (1) — 建立項目
用 Flask 來寫個輕博客 (2) — Hello World!
用 Flask 來寫個輕博客 (3) — (M)VC_鏈接 MySQL 和 SQLAlchemy
用 Flask 來寫個輕博客 (4) — (M)VC_建立數據模型和表
用 Flask 來寫個輕博客 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解
用 Flask 來寫個輕博客 (6) — (M)VC_models 的關係(one to many)
用 Flask 來寫個輕博客 (7) — (M)VC_models 的關係(many to many)
用 Flask 來寫個輕博客 (8) — (M)VC_Alembic 管理數據庫結構的升級和降級
用 Flask 來寫個輕博客 (9) — M(V)C_Jinja 語法基礎快速概覽 git

Jinja 中經常使用的過濾器

default

  • 若是傳入變量代碼塊的值爲 None,則傳入默認值:
{{ post.date | default("2016-11-22") }}
  • 若但願傳入變量代碼塊的值爲 False 時,使用默認值,能夠將 True 傳入 default 過濾器的第二個參數 。
{{ '' | default('String', True)}}

float

將傳入變量代碼塊中的值轉換爲浮點數,相似於 Python 的 float()github

{{ 75 | float }}

int

相似於 Python 的 int()web

{{ 75.5 | int }}

lenght

相似於 Python 中的 len()數據庫

The Count: {{ post.tags | lenght }}

title

將傳入變量代碼塊的 String 的首字母轉換成大寫,成爲一個合格的 Title。express

{{ "post title" | title }}

round

相似於 Python 的 round() 定義浮點數的精度。django

{{ 3.14159 | round(1) }}
  • common 參數:四捨五入
  • floor 參數:截取整數部分
  • ceil 參數:向上取整
{{ 4.7 | rount(1, "common")}}

join

將傳入變量代碼塊的列表變量中的元素做爲字符串鏈接起來,相似於 Python 的 join()json

{{ ['JmilkFan', 'fanguiju' ] | join(',')}}

tojson

過濾器 tojoin 其實是調用了 Python 的 json.dumps 函數來序列化對象,同樣的須要確保傳入變量代碼塊的是一個能夠被序列化的對象 Dict。flask

{{ {"key": "value" | tojson }}}

若是咱們採用將 SQLAlchemy models 的查詢對象直接傳入模板文件中進行渲染的方式來生成整個 HTML 頁面時,咱們就會經常使用到 tojson 過濾器,並且咱們還須要將序列化後的結果進行 safe 處理,才能保證其安全性。瀏覽器

{{ posts | tojson | safe }}

truncate

用於截取指定長度的 String 對象,並在截取後的子字符串後添加省略號。

{{ "a long stringggggggggggggggggg " | truncate(5) }}

escape

若是傳入變量代碼塊的是 HTML 字符串,則將該字符串中的 &、<、>、’、」 做爲 HTML 的轉義序列打印。

{{ "<h1>Title<\h1>" | escape }}

safe

safe 過濾器含有 escape 的功能,將傳入到變量代碼塊中的 HTML 字符串中的特殊符號進行 HTML 轉義,這是必要的安全手段
假如咱們須要直接將 HTML 做爲變量傳入到變量代碼塊中,並且這個傳入的接口是公開的話,咱們就須要防止用戶提交惡意的 HTML 代碼。若是 Jinja 沒有 HTML 轉義功能的話,那麼咱們訪問這個變量代碼塊的時候就會運行這些被提交的惡意 HTML 代碼了。EG. 一個用戶在回覆框輸入了含有 Script 標籤的 HTML 代碼,那麼全部打開該頁面的瀏覽器都會執行這些 Script。

但有一個問題就是:在有些狀況下咱們不該該對 HTML 進行轉義且須要保證安全性的,對於這個問題,escape 過濾器是沒法解決的。因此 Jinja 提供了 safe 過濾器。

{{ "<h1>Post Title"</h1> | safe }}

自定義過濾器

在 Jinja 中自定義一個過濾器,有如編寫一個 Python 函數。

  • 定義過濾器函數
def count_substring_from_python(string, sub):
    return string.count(sub)
  • 在 main.py 中聲明過濾器函數
app.jinja_env.filters['count_substring'] = count_substring_from_python
  • 在模板文件中調用自定義過濾器
{{ variable | filter_name("String") }}

將過濾器函數 count_substring_from_python 映射成爲過濾器 count_substring

Flask 的特殊變量和方法

這些 Flask 特殊的變量和方法,都是能夠在模板文件中直接訪問的。

config 對象

config 對象就是 Flask 的 config 對象,也就是 app.config 對象,其包含了 class DevConfig 的屬性。

{{ config.SQLALCHEMY_DATABASE_URI }}

request 對象

就是 Flask 中表示當前請求的 request 對象。

{{ request.url }}

session 對象

就是 Flask 的 session 對象。

{{ session.new }}

url_for 方法

url_for() 會返回傳入的路由函數對應的 URL,所謂的路由函數就是被 app.route() 路由裝飾器裝飾的函數。EG. main.py 中的 home()。

{{ url_for('home') }}
  • 若是咱們定義的路由函數是帶有參數的,EG. /post/1024,則能夠將這些參數做爲命名參數傳入:
{{ url_for('post', post_id=1024) }} 

get_flashed_messages 方法

返回以前在 Flask 中經過 flash() 傳入的信息列表,相似實現一個隊列。EG. 把 Python String 對象表示的消息加入到一個消息隊列中,而後經過調用 get_flashed_messages() 方法來逐一取出並消費掉。

{% for message in get_flashed_messages() %} {{ message }} {% endfor %}

NOTE: 前提是該消息隊列是由 flash() 來生成的。

相關文章
相關標籤/搜索