天天看點

用 Flask 來寫個輕部落格 (16) — MV(C)_Flask Blueprint 藍圖目錄前文清單擴充閱讀Blueprint 藍圖定義一個藍圖注冊一個藍圖建立藍圖 blog

<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="#%E6%89%A9%E5%B1%95%E9%98%85%E8%AF%BB">擴充閱讀</a>

<a href="#blueprint-%E8%93%9D%E5%9B%BE">Blueprint 藍圖</a>

<a href="#%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E8%93%9D%E5%9B%BE">定義一個藍圖</a>

<a href="#%E6%B3%A8%E5%86%8C%E4%B8%80%E4%B8%AA%E8%93%9D%E5%9B%BE">注冊一個藍圖</a>

<a href="#%E5%88%9B%E5%BB%BA%E8%93%9D%E5%9B%BE-blog">建立藍圖 blog</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>

<a href="http://blog.csdn.net/jmilk/article/details/53303870">用 Flask 來寫個輕部落格 (11) — M(V)C_建立視圖函數</a>

<a href="http://blog.csdn.net/jmilk/article/details/53306560">用 Flask 來寫個輕部落格 (12) — M(V)C_編寫和繼承 Jinja 模闆</a>

<a href="http://blog.csdn.net/jmilk/article/details/53321939">用 Flask 來寫個輕部落格 (13) — M(V)C_WTForms 服務端表單檢驗</a>

<a href="http://blog.csdn.net/jmilk/article/details/53327164">用 Flask 來寫個輕部落格 (14) — M(V)C_實作項目首頁的模闆</a>

<a href="http://blog.csdn.net/jmilk/article/details/53332204">用 Flask 來寫個輕部落格 (15) — M(V)C_實作博文頁面評論表單</a>

<a href="http://www.pythondoc.com/flask/blueprints.html">用藍圖實作子產品化應用</a>

<a href="https://zhuanlan.zhihu.com/p/21743996">第一期 · 如何了解Flask中的藍圖?</a>

Blueprint 藍圖是一種用來擴充已有 Flask 應用結構的方法,通過藍圖的思想我們能夠把自己的 Application 拆分成為不同的元件。通常,一個元件代表了 Application 的一個功能子產品,我們稱之為一個藍圖,但本質上是由一些被注冊到這個藍圖中的視圖集所組成的。而且還可以在該藍圖中定義其獨有的模闆檔案目錄(template_folder)和靜态檔案目錄(static_folder)。最後,将一個個這樣的藍圖 Register 到 Flask 的主 app 中,最終整合成為一個完整的 Application,是以藍圖在 Flask 中充當了 MVC 架構中的 Controller 角色。在本項目裡,我們也會使用藍圖的方法來重構已往的代碼和目錄結構。

NOTE : 這裡隻是一個輔助了解的例子,并不作用到項目中。

vim admin_pages/admin.py

NOTE 1: 藍圖類<code>Blueprint</code> 必須接收兩個參數 藍圖名(admin) 和 目前的包名(__name__)

NOTE 2: 可選參數定義了該藍圖到那裡去尋找所需要的檔案(template_folder/static__folder)

NOTE 3: 由于指定了參數 template_folder 是以該藍圖的視圖函數 home() 不會到預設的 template/ 目錄下尋找模闆檔案 home.html 而是到 template/admin/ 目錄下尋找 home.html

NOTE 4: 參數 url_prefix 會為 URL 添加上字首 admin,即:視圖函數 home() 的 URL 路由實際上是 /admin/ ,而不是 /

NOTE 5: 是以當我們在模闆中使用 url_for() 函數時,傳入的參數就不是 url_for(‘home’) 了,而是 url_for(‘admin.home’) 或 url_for(‘.home’) 如果需要查找的 URL 路由跟目前視圖函數是在同一個藍圖下的話。

需要将藍圖注冊到 Flask 的 app 中,該藍圖才能夠生效。

main.py

這就是定義一個藍圖并将該藍圖注冊到 app 中的過程。接下來我們就會将藍圖應用到 blog 項目中來。

views.py

建立藍圖首先我們要在視圖函數的子產品中使用 Blueprint class 來生成一個藍圖對象,使視圖子產品程式設計藍圖子產品。

由于為藍圖 blog 定義了新的模闆檔案存放路徑,是以将該藍圖所需要的模闆檔案都從 templates/ move 到 templates/blog/ 下。

将所有的 app.route() 修改為使用藍圖的路由定義,将視圖函數都注冊到藍圖中:

在 <code>if __name__ == '__main__':</code> 之後将建立的藍圖對象 blog_blueprint 注冊到 app 中:

現在藍圖 blog 将所有的視圖函數都搬離 app 注冊到藍圖 blog 中了,但是 app 對象作為入口不能夠沒有視圖函數,是以在為其定義一個根目錄視圖函數,并且重定向到藍圖 blog 的 home() 中:

NOTE: 這裡的 url_for 傳入了 blog.name 而不是 blog_blueprint.home 是因為 Flask 内部搜尋的關鍵字為藍圖的名字而不是藍圖對象的變量名。