天天看點

用 Flask 來寫個輕部落格 (10) — M(V)C_Jinja 常用過濾器與 Flask 特殊變量及方法目錄前文清單Jinja 中常用的過濾器Flask 的特殊變量和方法

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E5%89%8D%E6%96%87%E5%88%97%E8%A1%A8">前文清單</a>

<a href="#jinja-%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E8%BF%87%E6%BB%A4%E5%99%A8">Jinja 中常用的過濾器</a>

<a href="#default">default</a>

<a href="#float">float</a>

<a href="#int">int</a>

<a href="#lenght">lenght</a>

<a href="#title">title</a>

<a href="#round">round</a>

<a href="#join">join</a>

<a href="#tojson">tojson</a>

<a href="#truncate">truncate</a>

<a href="#escape">escape</a>

<a href="#safe">safe</a>

<a href="#%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%87%E6%BB%A4%E5%99%A8">自定義過濾器</a>

<a href="#flask-%E7%9A%84%E7%89%B9%E6%AE%8A%E5%8F%98%E9%87%8F%E5%92%8C%E6%96%B9%E6%B3%95">Flask 的特殊變量和方法</a>

<a href="#config-%E5%AF%B9%E8%B1%A1">config 對象</a>

<a href="#request-%E5%AF%B9%E8%B1%A1">request 對象</a>

<a href="#session-%E5%AF%B9%E8%B1%A1">session 對象</a>

<a href="#urlfor-%E6%96%B9%E6%B3%95">url_for 方法</a>

<a href="#getflashedmessages-%E6%96%B9%E6%B3%95">get_flashed_messages 方法</a>

<a href="http://blog.csdn.net/jmilk/article/details/53150084">用 Flask 來寫個輕部落格 (1) — 建立項目</a>

<a href="http://blog.csdn.net/jmilk/article/details/53152158">用 Flask 來寫個輕部落格 (2) — Hello World!</a>

<a href="http://blog.csdn.net/jmilk/article/details/53153382">用 Flask 來寫個輕部落格 (3) — (M)VC_連接配接 MySQL 和 SQLAlchemy</a>

<a href="http://blog.csdn.net/jmilk/article/details/53184903">用 Flask 來寫個輕部落格 (4) — (M)VC_建立資料模型和表</a>

<a href="http://blog.csdn.net/jmilk/article/details/53187575">用 Flask 來寫個輕部落格 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解</a>

<a href="http://blog.csdn.net/jmilk/article/details/53229180">用 Flask 來寫個輕部落格 (6) — (M)VC_models 的關系(one to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53239740">用 Flask 來寫個輕部落格 (7) — (M)VC_models 的關系(many to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53241361">用 Flask 來寫個輕部落格 (8) — (M)VC_Alembic 管理資料庫結構的更新和降級</a>

<a href="http://blog.csdn.net/jmilk/article/details/53264049">用 Flask 來寫個輕部落格 (9) — M(V)C_Jinja 文法基礎快速概覽</a>

如果傳入變量代碼塊的值為 None,則傳入預設值:

若希望傳入變量代碼塊的值為 False 時,使用預設值,可以将 True 傳入 default 過濾器的第二個參數 。

将傳入變量代碼塊中的值轉換為浮點數,類似于 Python 的 float()

類似于 Python 的 int()

類似于 Python 中的 len()

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

類似于 Python 的 round() 定義浮點數的精度。

common 參數:四舍五入

floor 參數:截取整數部分

ceil 參數:向上取整

将傳入變量代碼塊的清單變量中的元素作為字元串連接配接起來,類似于 Python 的 join()

過濾器 tojoin 實際上是調用了 Python 的 json.dumps 函數來序列化對象,一樣的需要確定傳入變量代碼塊的是一個可以被序列化的對象 Dict。

如果我們采用将 SQLAlchemy models 的查詢對象直接傳入模闆檔案中進行渲染的方式來生成整個 HTML 頁面時,我們就會常常使用到 tojson 過濾器,而且我們還需要将序列化後的結果進行 safe 處理,才能保證其安全性。

用于截取指定長度的 String 對象,并在截取後的子字元串後添加省略号。

如果傳入變量代碼塊的是 HTML 字元串,則将該字元串中的 &amp;、&lt;、&gt;、’、” 作為 HTML 的轉義序列列印。

safe 過濾器含有 escape 的功能,将傳入到變量代碼塊中的 HTML 字元串中的特殊符号進行 HTML 轉義,這是必要的安全手段。

假如我們需要直接将 HTML 作為變量傳入到變量代碼塊中,而且這個傳入的接口是公開的話,我們就需要防止使用者送出惡意的 HTML 代碼。如果 Jinja 沒有 HTML 轉義功能的話,那麼我們通路這個變量代碼塊的時候就會運作這些被送出的惡意 HTML 代碼了。EG. 一個使用者在回複框輸入了含有 Script 标簽的 HTML 代碼,那麼所有打開該頁面的浏覽器都會執行這些 Script。

但有一個問題就是:在有些情況下我們不應該對 HTML 進行轉義且需要保證安全性的,對于這個問題,escape 過濾器是無法解決的。是以 Jinja 提供了 safe 過濾器。

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

定義過濾器函數

在 main.py 中聲明過濾器函數

在模闆檔案中調用自定義過濾器

将過濾器函數 <code>count_substring_from_python</code> 映射成為過濾器 <code>count_substring</code>

這些 Flask 特殊的變量和方法,都是可以在模闆檔案中直接通路的。

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

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

就是 Flask 的 session 對象。

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

如果我們定義的路由函數是帶有參數的,EG. <code>/post/1024</code>,則可以将這些參數作為命名參數傳入:

傳回之前在 Flask 中通過 <code>flash()</code> 傳入的資訊清單,類似實作一個隊列。EG. 把 Python String 對象表示的消息加入到一個消息隊列中,然後通過調用 <code>get_flashed_messages()</code> 方法來逐一取出并消費掉。

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