1. 程式人生 > >用 Flask 來寫個輕部落格 (17) — MV(C)_應用藍圖來重構專案

用 Flask 來寫個輕部落格 (17) — MV(C)_應用藍圖來重構專案

目錄

前文列表

重構目錄結構

現在專案的目錄結構:

(env) [[email protected] opt]# tree JmilkFan-s-Blog/ -L 1
JmilkFan-s-Blog/
├── config.py
├── env
├── fake_data.py
├── main.py
├── manage.py
├── migrations
├── models.py
├── README.md
├── requirements.txt
├── static
├── templates
├── views.py
└── wt_forms.py

這裡寫圖片描述

我們會一步一步的將整個專案模組化

  • 建立存放整個模組的資料夾 jmilkfansblog
    NOTE: 一般來說這個資料夾的名字應該跟專案的名字一模一樣

  • 將檔案 config.py/models.py 和目錄 static/template move 到 jmilkfansblog 目錄下

  • 將檔案 main.py move 到 jmilkfansblog 目錄下並重命名為 __init__.py,將 wt_forms.py move 到 jmilkfansblog 目錄下並重命名為 forms.py

  • 建立 jmilkfansblog/controllers 目錄,並建立控制器 jmilkfansblog/controllers/blog.py

  • 將 views.py move 成為 jmilkfansblog/controllers/blog.py

現在整個目錄結構應該是這樣的

(env) [[email protected] JmilkFan-s-Blog]# tree -L 3
.
├── fake_data.py
├── jmilkfansblog
│   ├── config.py
│   ├── controllers
│   │   ├── blog.py
│   │   └── __init__.py
│   ├── forms.py
│   ├── __init__.py
│   ├── models.py
│ ├── static │ │ ├── css │ │ ├── fonts │ │ └── js │ └── templates │ ├── blog │ └── __init__.py ├── manage.py ├── migrations │ ├── alembic.ini │ ├── env.py │ ├── README │ └── script.py.mako │ └── versions │ └── __init__.py ├── README.md └── requirements.txt

NOET :在現在的目錄結構中,存在這大量的 __init__.py 檔案,這是當在一個目錄結構中存在該檔案的話,Python 就會將會該目錄解析成為一個包。

重構程式碼

  • 首先要將所有 move 到 blog 中的模板檔案中的 url_for() 函式中的引數修改為 url_for('blog.XXX')url_for('.XXX')(當檢視函式XXX是屬於該模板目錄所對應的藍圖時才能使用)。這是因為使用藍圖之後可能會出現多個同名的檢視函式,所以 url_for() 函式中的引數必須是 ‘絕對路徑’ 才能夠正確的返回檢視函式所對應的 URL。EG url_for('blog.home', page=3) 所返回的 URL 為 http://127.0.0.1:8089/blog/3 中的 /blog/3 ,而不是 /3
    NOTE : 在 blog.py 中的檢視函式 home() 的路由裝飾器為 @blog_blueprint.route('/'),而不是 @blog_blueprint.route('/blog/'),這是因為建立藍圖物件 blog_blueprint 時,傳入 url_prefix 的實參為 ‘/blog’,所以所有裝飾器 @blog_blueprint.route 的路由 URL 定義會被自動的加入 ‘/blog’ 字首。這樣也便於我們編寫同一個藍圖下檢視函式的路由程式碼。

  • 將所有的 SQLAlchemy 程式碼都遷移到 models 模組中,其中包括了 import SQLAlchemy 的相關語句Model classtables object 等。

    • models.py
from flask.ext.sqlalchemy import SQLAlchemy


# 在 jmilkfansblog/__init__.py 中再初始化 db 物件
db = SQLAlchemy()

posts_tags = db.Table('posts_tags',
    db.Column('post_id', db.String(45), db.ForeignKey('posts.id')),
    db.Column('tag_id', db.String(45), db.ForeignKey('tags.id')))


class User(db.Model):
    """Represents Proected users."""

...

NOTE : 資料庫物件 db 的初始化不能再在 models 模組中進行,因為如果在該模組中匯入 app 物件,很可能會造成將所有的的情況,所以我們將初始化 db 物件的程式碼實現在了 jmilkfansblog/__init__.py 中。

  • 將所有的 WTForm 程式碼都遷移到 forms 模組中,其中包括了 所有的 Form classValidation function 等。直接將 wt_forms.py 重新命名為 forms.py 就可以了

  • 將 jmilkfansblog/controllers/blog.py 定義成為一個表示部落格展示頁功能(表現層)元件的 Flask Blueprint,需要把 views 模組中所有的 路由函式檢視函式sidebar_data() 等都遷移到 blog 模組中,實際上我們可以 mv views.py jmilkfansblog/controllers/blog.py 然後再做修改:

    • blog.py
from uuid import uuid4
from os import path
from datetime import datetime

from flask import render_template, Blueprint
from sqlalchemy import func

from jmilkfansblog.models import db, User, Post, Tag, Comment, posts_tags
from jmilkfansblog.forms import CommentForm


blog_blueprint = Blueprint(
    'blog',
    __name__,
    # path.pardir ==> ..
    template_folder=path.join(path.pardir, 'templates', 'blog'),
    # Prefix of Route URL 
    url_prefix='/blog')


def sidebar_data():
    """Set the sidebar function."""

...

NOTE:現在當我們需要為這個 blog Application 新增一個新的藍圖時,我們只需要在 jmilkfansblog/controllers/ 目錄下新建一個模組檔案就可以實現。

  • 再一個,我們需要多 jmilkfansblog/init.py 檔案進行重構,該檔案應該包含了 app 物件的建立index()註冊藍圖 等程式碼。當然我們還要將初始化資料庫物件 db

    • jmilkfansblog/__init__.py
  • 最後需要修改 manage.py 中的匯入語句

from flask import Flask, redirect, url_for

from config import DevConfig
from models import db
from controllers import blog

app = Flask(__name__)
# Get the config from object of DecConfig
app.config.from_object(DevConfig)

# Will be load the SQLALCHEMY_DATABASE_URL from config.py to db object
db.init_app(app)

@app.route('/')
def index():
    # Redirect the Request_url '/' to '/blog/'
    return redirect(url_for('blog.home'))

# Register the Blueprint into app object
app.register_blueprint(blog.blog_blueprint)

if __name__ == '__main__':
    app.run()

NOTE:以往我們還需要在 main.py 中匯入檢視模組 views 才能夠使這些檢視函式生效,現在因為我們將藍圖物件註冊到了 app 物件中,而且 index() 路由函式還重定向到了 'blog/home() 中 。所以現在我們並不需要將 blog 模組匯入到 jmilkfansblog/__init__.py 也能使這些檢視函式生效了。

使用藍圖後的路由過程

我們假設現在有人使用瀏覽器訪問 http://127.0.0.1:8089/

  • / :被 jmilkfansblog.__init__:index() 獲取,並重定向到 /blog/
  • /blog/
    :被 jmilkfansblog.controllers.blog.home() 獲取,然後渲染並返回 jmilkfansblog/templates/blog/home.html

總結

  • controllers 目錄的意義:在 controllers/ 目錄下,我們定義的 blog.py 藍圖模組(因為含有藍圖物件,並將檢視函式註冊到了該藍圖物件中),本質上就是以往的檢視模組,主要還是用於控制 HTTP 請求的 URL 路由跳轉。在以後的開發過程中,如果需要定義一個新的藍圖,那麼我們只需要在該目錄下建立一個新的藍圖模組,並將藍圖模組中的藍圖物件註冊到應用程式入口 jmilkfansblog/init.py 的 app 物件中就可以了。

  • 將檢視函式註冊到藍圖中:能夠讓我們在定義檢視函式的路由 URL 的時候更加方便,而且自成一套名稱空間,使得 Python 程式碼更加簡潔。但是需要注意的是,我們一般會為一個藍圖準備獨立出一個存放其模板檔案和靜態檔案的目錄,所以在編寫模板檔案的時候,一定要注意在 url_for 中使用 全路徑 的引用方式。

  • 將藍圖註冊到 app 中:藍圖是為了讓整個專案更具模組化,引入了元件的思想,使得一個專案就像是由多個元件組合起來的一樣。符合鬆耦合的設計思想,極大的提高了專案的擴充套件能力和便於合作開發。在這個專案中引入藍圖是為了以後新增後臺管理元件、使用者登陸元件等所做的準備。

相關推薦

Flask 部落 (17) — MV(C)_應用藍圖重構專案

目錄 前文列表 重構目錄結構 現在專案的目錄結構: (env) [[email protected] opt]# tree JmilkFan-s-Blog/

Flask 部落 (16) — MV(C)_Flask Blueprint 藍圖

目錄 前文列表 擴充套件閱讀 Blueprint 藍圖 Blueprint 藍圖是一種用來擴充套件已有 Flask 應用結構的方法,通過藍圖的思想我們能夠把自己的 Application 拆分成為不同的元件。通常,一個元件代

Flask 部落 (26) — 使用 Flask-Celery-Helper 實現非同步任務

目錄 前文列表 擴充套件閱讀 Celery Celery 是使用 Python 多工庫來編寫的任務佇列工具, 可以 並行 的執行任務. 我們會將執行時間較長但又不那

Flask 部落 (14) — M(V)C_實現專案首頁的模板

目錄 前文列表 實現所需要的檢視函式 在開始實現首頁模板之前, 我們為了除錯和顯示的方便, 首先偽造一些假資料: fake_data.py import rand

Flask 部落 (23) — 應用 OAuth 實現 Facebook 第三方登入

目錄 前文列表 擴充套件閱讀 第三方登入流程 Resource Owner:資源所有者,本文中又稱”使用者”(user)。 Authorization server:認證伺服器,即服務提供商專門用來處理認證的伺服器。

Flask 部落 (6) — (M)VC_models 的關係(one to many)

目錄 前文列表 擴充套件閱讀 前言 models 中的關係能夠對映成為關係型資料庫表中的關係,models 中可以相互建立引用,使得相關聯的資料能夠很容易的一次性的從資料庫中取出。 一對多 首先繼續在 models

Flask 部落 (24) — 使用 Flask-Login 保護應用安全

目錄 前文列表 擴充套件閱讀 使用者登入帳號 Web上的使用者登入功能應該是最基本的功能了,但這個功能可能並沒有你所想像的那麼簡單,這是一個關係到使用者安全的功能. 在現代這樣速度的計算速度下,用窮舉法破解賬戶的密碼會是一件

Flask 部落 (13) — M(V)C_WTForms 服務端表單檢驗

目錄 前文列表 用 Flask 來寫個輕部落格 (1) — 建立專案 用 Flask 來寫個輕部落格 (2) — Hello World! 用 Flask 來寫個輕部落格 (3) — (M)VC_連線 MySQL 和 SQLAlchemy

Flask 部落 (2) — Hello World!

目錄 前文列表 擴充套件閱讀 實現最簡單的 Flask 應用 建立 config.py 檔案 該檔案是整個 Flask 應用程式的配置檔案,定義我們常用的配置類 Config/ProdConfig/DevConfig

Flask 部落 (3) — (M)VC_連線 MySQL 和 SQLAlchemy

目錄 前文列表 擴充套件閱讀 前言 大多數的應用程式在開發之前都需要先進行資料庫設計這一環節,所以本篇就先來記錄在 Flask 中如何使用 Models,也就是 MVC 模式中的 M 。 Models 模型 模型 就

Flask 部落 (31) — 使用 Flask-Admin 實現 FileSystem 管理

目錄 前文列表 擴充套件閱讀 編寫 FileSystem Admin 頁面 所謂的 FileSystem Admin 功能, 就是哪呢鋼構通過後臺管理頁面檢視並修改 blog 專案中, 或自定義的檔案目錄內容. 使用 F

Flask 部落 (7) — (M)VC_models 的關係(many to many)

目錄 目錄 前文列表 擴充套件閱讀 前期準備 多對多 使用樣例 前文列表 擴充套件閱讀 前期準備 在實現多對多之前,我們還需要先增加一個評論(Comment) models class,而且 Comment 是 P

Flask 部落 (37) — 在 Github 上為第一階段的版本打 Tag

目錄 目錄 前文列表 打 Tag 前文列表 第一階段結語 從 2016/11/13 至今 2017/01/02 剛好 50 天, <<用 Flask 來寫個輕部落格>> 系列博文的第一階段也就算告一段

Flask 部落 (32) — 使用 Flask-RESTful 構建 RESTful API 之一

目錄 前文列表 擴充套件閱讀 RESTful API REST(Representational State Transfer):是一種軟體架構的設計風格,而不是一種標準。主要用於 C/S 架構的軟體設計,也能很好的支援 B

Flask 部落 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解

目錄 前文列表 擴充套件閱讀 SQLAlchemy 的 CRUD CRUD 提供了在 Web 應用程式中所需要的所有操作和檢視資料的基礎功能, 尤其在 REST 風格的應用中, CRUD 就能實現一切所需功能. 本篇博文主要記

段子了 誰說部落不能段子

1. 你就是我的第一志願 因為我想上你 2.我願有一天能牽著你的手 ,去敬各位來賓的酒 3.我給你變個魔術,我變完了 我變得更喜歡你了,但你卻看不到。 4.我喜歡一個人,  那人一定很漂亮吧 !你太自戀了。 5.在遇見你之前我有兩顆心,,一顆善心 一顆噁心,,現在我只有一顆

markdown的新部落覆蓋了原有的部落,導致原有的部落消失了

查了一下,確實是找不到了,瀏覽量還是存在的。只有重新寫了,那是在markdown上快取的部落格,感覺是個小bug。 剛開始用csdn,不會用markdown真是一臉黑。 查了下,點(也不知道圖片上傳成功了沒)新建就可以了。也確實可以了!

Flask開發部落(二):Flask-模板

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 目錄 上節回顧 如果你依照上一章的話,你應當有一個完全工作的簡單的 web 應用程式,我們專案的檔案結構如下(前

FLask框架第一小程式

#encoding:utf-8 #從flask這個包中匯入Flask這個類 from flask import Flask #初始化一個Flask物件叫app #需要傳遞一個引數__name__ #1.方便flask框架尋找資源 #2.方便flask外掛比如Flask-S