天天看點

用 Flask 來寫個輕部落格 (11) — M(V)C_建立視圖函數目錄前文清單視圖函數在 views.py 檔案中定義視圖函數

<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="#%E8%A7%86%E5%9B%BE%E5%87%BD%E6%95%B0">視圖函數</a>

<a href="#%E5%9C%A8-viewspy-%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AE%9A%E4%B9%89%E8%A7%86%E5%9B%BE%E5%87%BD%E6%95%B0">在 viewspy 檔案中定義視圖函數</a>

<a href="#%E5%AE%9A%E4%B9%89%E5%8F%B3%E4%BE%A7%E8%BE%B9%E6%A0%8F%E7%9A%84%E8%A7%86%E5%9B%BE%E5%87%BD%E6%95%B0">定義右側邊欄的視圖函數</a>

<a href="#%E4%B8%BA%E6%AF%8F%E4%B8%80%E5%BC%A0%E6%95%B0%E6%8D%AE%E8%A1%A8%E5%AE%9A%E4%B9%89%E8%A7%86%E5%9B%BE%E5%87%BD%E6%95%B0">為每一張資料表定義視圖函數</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>

<a href="http://blog.csdn.net/jmilk/article/details/53292248">用 Flask 來寫個輕部落格 (10) — M(V)C_Jinja 常用過濾器與 Flask 特殊變量及方法</a>

視圖函數: 就是為 Jinja 模闆檔案中的變量準備資料對象的 Python 函數, 我們一般會在視圖函數中準備好需要傳遞給 Jinja 模闆檔案的 Python 資料對象, 并應用到 Jinja 檔案中的變量代碼塊中.

現在我們假設需要在 blog 中的每一個頁面的右側邊欄(sidebar)中顯示 最近釋出的 5 篇檔案 和 文章數最多的 5 個标簽, 我們就需要定義一個視圖函數 <code>sidebar_data()</code>, 該函數就會為右側邊欄提供所需要的 Python 資料對象, 并且這些 Python 資料對象是能夠從資料庫中擷取的.

NOTE 1: 由于每個頁面都需要右側邊欄的資料, 是以将這些高重用的代碼抽象成為一個函數.

NOTE 2: <code>sidebar_data()</code> 函數中調用了 sqlalchemy.func 庫, func 庫提供了一個計數器 <code>count</code> 用于傳回 tags 表中值相同的 post_id 列的數量,來得到 post 數最多的 tags。

NOTE 3: 因為 views.py 會作為所有視圖函數的定義檔案, 是以将 main.py 中的視圖函數 <code>home()</code> 遷移到該檔案中.

main.py

NOTE 1: 因為 Flask Server 的 Route 使用 main 子產品中查詢路由函數(EG. home)的,是以必須将 views 子產品中的視圖函數(路由函數)導入到 main 子產品的全局作用域中。

NOTE 2: 因為 views 子產品中導入了 main.app 對象,而 main 子產品又需要導入 views 子產品,是以在 main.py 導入 views.py 之前一定要先生成 main.app 對象,否則會出現 NameError。

在設計資料庫時, 就将所需要展現的頁面和功能子產品抽象到一個資料表中, 即每張資料表的資料都會被用于對應的 Jinja 模闆中, 是以一般來說會為每張表即每一個不同的 Jinja 模闆都定義一個視圖函數, 但實際上可以靈活處理. 而且由因為這些視圖函數都被 <code>route()</code> 裝飾器所裝飾,是以同時也充當着路由函數的功能。

views.py

NOTE 1: 定義視圖函數時, 一般會按照下面幾點來處理:

擷取主要的資料表對象, EG. posts

擷取與該表由關聯的資料表對象, EG. posts 與 comments 是 one to many 的關系, posts 與 tags 是 many to many 的關系, 是以會 通過 posts 對象來擷取 tags 對象和 comments 對象.

最後會補充擷取這一 Jinja 模闆中仍需要的資料對象, EG. recent/top_tags

NOTE 2: flask 提供的 <code>render_template()</code> 函數, 就是将視圖函數和 Jinja 模闆檔案關聯起來的橋梁, 該函數的第一個參數就是 Jinja 模闆檔案的名稱字元串, 之後的命名參數就是要傳入該模闆檔案的資料對象, 而這些資料對象就會替代 Jinja 模闆中的變量代碼塊.

NOTE 3: 為了提高代碼的重用, 将每一個 Jinja 模闆檔案都會用到的右側邊欄所需要的資料抽象成一個函數.

NOTE 4: 在 <code>app.route()</code> 函數中可以定義多樣的 URL 路由規則, 也可以為一個視圖函數定義多條 URL 路由規則, 在這個 Blog 項目中的 URL 設計應該遵循 RESLful 風格.