Flask Web 極簡教程(二)- Flask 模板(Part D)

語言: CN / TW / HK
ead>

四、過濾器

模板中的過濾器

模板中的過濾器可以對來自響應中資料進行處理,過濾器有以下幾種使用方式; - 使用管道符|,可以進行鏈式呼叫,也可以通過()進行傳參 - 使用filter標籤

app.py 中新增檢視函式 filter 函式 python @app.route('/filter') def filter(): name = 'Thor' heros = {'stark', 'clint', 'loki'} return render_template('filter.html', name=name, heros=heros)

templates 資料夾下新建 filter.html 頁面 ```html

Filter

使用管道符 |

{{ name|upper }}

{{ name|lower }}

{{ heros|length }}

{{ heros|join('-') }}

{{ heros|join('-')|length }}

`` 重新啟動應用,瀏覽器訪問/filter路徑,頁面資料經過管道符|` 的過濾,顯示結果如下:

image.png

修改 filter.html,改為通過標籤方式使用過濾器 ```html

使用filter標籤

{% filter upper %}

{{ name }}

{% endfilter %} {% filter lower %}

{{ name }}

{% endfilter %} {# 注意空格#} {% filter join('-') %}{{ name }}{% endfilter %} ```

重啟應用,瀏覽器再次訪問 /filter 路徑,頁面顯示結果如下: image.png

內建的過濾器函式生效

常用的內建過濾器 Jinja2 模板引擎中內建了一些常用的過濾器,如:

  • {{ value | abs}}:獲取 value 的絕對值
  • {{ value | default('預設值') }}{{ value | d('預設值') }}:預設值顯示
  • {{ value | escape }}{{ value | e }}:HTML 轉義
  • {{ value | safe }} :富文字內容轉義
  • {{ value | reverse }} :反轉

在 app.py 中的 filter 函式中增加一些變數,用於測試 abs 和 default 過濾器。 Python @app.route('/filter') def filter(): name = 'Thor' heros = {'stark', 'clint', 'loki'} abs_value = -1 d_value = 1 d_none_value = None return render_template('filter.html', name=name, heros=heros, abs_value = abs_value, d_value = d_value, d_none_value = d_none_value)

在 filter.html 頁面中使用這些變數,只需在 body 標籤中新增如下內容: ```html

內建過濾器

獲取絕對值過濾器

{{ abs_value | abs }}

預設值過濾器

{{ d_value | default(0) }}

{{ d_value_2 | default(0) }}

{{ d_none_value | default(0) }}

defalut 過濾器預設 None 值生效

{{ d_none_value | default(0, True) }}

```

儲存程式碼,瀏覽器訪問 /filter,頁面顯示結果如下:

image.png

可以看出 default 過濾器只會對沒有定義的變數起作用,當變數的值為 None 時無效。

如果先要使用預設值來取代 None 的值只需要在 default 函式中在增加一個 Bool 引數且值為 True 即可,在 filter.html 中的 body 標籤中增加如下內容:

```html

defalut 過濾器預設 None 值生效

{{ d_none_value | default(0, True) }}

```

儲存程式碼,瀏覽器再次訪問 /filter,頁面顯示結果如下:

image.png

None 值已經被預設值取代。

Jinja2 模板中使用 autoescape 標籤設定全域性是否自動轉義,如果要區域性設定需要使用 escape 過濾器。

在 filter 函式中將一段 html 程式碼儲存到變數中,並存放在上下文中

python @app.route('/filter') def filter(): # 其餘程式碼保持不變 html_code = "<h4>這是一段 HTML 程式碼</h4>" return render_template('filter.html', name=name, heros=heros, abs_value = abs_value, d_value = d_value, d_none_value = d_none_value, html_code = html_code)

在 filter.html 中使用 escape 過濾器渲染上下文中的變數

```html

內建過濾器

escape 過濾器

{% autoescape false %}

{{ html_code | e}}

{{ html_code }}

{% endautoescape %} ```

image.png

預設開啟了 autoescape,因此轉義 html 時加不加 escape 過濾器結果都是會被自動轉義

更多內建過濾器的使用可檢視 Jinja2 官網中列出的過濾器清單

image.png

自定義過濾器

如果模板中提供的過濾器都無法滿足需求,那麼就需要自定義過濾器,比如個人資訊脫敏等。

自定義過濾器有兩種方式,以自定義一個隱藏個人真實姓名的過濾器 name_masking為例

第一種方式,使用裝飾器註冊自定義過濾器

在 app.py 中新增函式 name_masking_filter,使用裝飾器 @app.template_filter 將該函式註冊為一個過濾器,裝飾器後的括號中指定過濾器的名字,既可以在模板中使用的名字。

python @app.template_filter('name_masking') def name_masking_filter(name): return name[0] + '**'

在 filter.html 頁面中使用該過濾器,在 body 標籤中增加如下內容:

```html

自定義過濾器使用

{{ '特朗普' | name_masking }}

```

儲存程式碼,瀏覽器訪問 /filter

image.png

名字已經被替換為 **

第二種方式,使用函式註冊自定義過濾器

將上面使用裝飾器註冊過濾器的程式碼註釋掉,只需要將裝飾器註釋即可,通過 Flask 物件 app 呼叫 jinja_env 函式來註冊自定義的過濾器

```python def name_masking_filter(name) return return name[0] + '**'

註冊自定義過濾器

app.jinja_env.filters['name_masking'] = name_masking_filter ```

儲存程式碼,瀏覽器訪問 /filter

image.png

過濾器生效,名字已經被替換為 **