1. 程式人生 > >Flask 學習1 專案搭建 目錄結構

Flask 學習1 專案搭建 目錄結構

一、程式的目錄結構

|ProjectName
|-app/ 程式包
|  |-__init__.py
|  |-models.py  // 資料庫模型
|  |-emails.py  // 郵件處理程式
|  |-main/  // 程式模組,根據業務區分,不同的模組可以各自擁有自己的單獨目錄
|  |  |-__init__.py
|  |  |-views.py
|  |  |-errors.py
|  |  |-forms.py
|  |-templates/  // Jinja2的html模板
|  |-static/  // css、js、圖片等靜態檔案
|-migrations/  // 資料庫遷移資料夾
|-venv/  // 虛擬環境
|-tests/  // 單元測試程式,可以包含多個檔案
|  |-__init__.py
|  |-test*.py  // 單元測試檔案
|-manage.py  // 啟動程式
|-config.py  // 全域性配置檔案
|readme.txt

二、程式中各檔案說明

這是初學備忘:以下各程式檔案只有最基本的內容,主要是為了讓程式能執行起來,通過這些目錄結構以及各檔案之間的引用,弄明白各檔案的作用,以及他們之間的關係。後續在不斷完善功能的過程中,各檔案的內容會不斷的增加。

首先我們新建一個名為app(也可以是別的名字)的python package,然後再在app資料夾中新建一個名為main的python package
在Pycharm中新建的Python Package資料夾下預設有一個__init__.py的檔案,到時我們例項化整個Flask應用,藍圖各個模組的藍圖物件就是在這些檔案。

2.1建立藍圖物件

什麼是藍圖(blueprint)
http://www.zhihu.com/question/31748237/answer/55313054
知乎的答案已經很詳細啦,其實簡而言之呢就是在同一個app內實現程式碼的模組化,不同的功能可以封裝成不同的Package,管理起來方便的多(有點類似django的app)。

我們先在 app/main/__init__.py 檔案中建立一個藍圖物件:

from flask import Blueprint
main = Blueprint('main',__name__)

from . import views

通過例項化一個Blueprint 類物件可以建立藍本。這個建構函式有兩個必須指定的引數:
藍本的名字和藍本所在的包或模組。和程式一樣,大多數情況下第二個引數使用Python 的__name__ 變數即可。

2.2 路由檔案 views.py

程式的路由儲存在包裡的app/main/views.py 模組中,而錯誤處理程式儲存在app/main/ errors.py模組中。匯入這兩個模組就能把路由和錯誤處理程式與藍本關聯起來。
注意,這些模組在app/main/__init__.py指令碼的末尾匯入,這是為了避免迴圈匯入依賴,因為在 views.pyerrors.py 中還要匯入藍本main。

app/main/views.py:藍本中定義的程式路由

from . import main
@main.route('/')	//注意這裡是 main.route 而不再是 app.route
@main.route('/index')
def index():
    return "Hello, World!"

2.3 app/__init__.py:程式包的構造檔案,使用工廠函式,註冊藍本

from flask import Flask
from config import Config

def create_app():
    app = Flask(__name__)
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)	//註冊藍本

    return app

2.4啟動指令碼 manage.py

from app import create_app

app = create_app()

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

通過構建第一章節的目錄結構,以及第二章節中提到的4個程式檔案,即可執行起來一個最基本的flask專案,目錄結構中提到的 config.pymodels.pyerrors.pyemails.py等檔案在這個例子中並沒有使用到,在後續完善功能的過程中會陸續增加其內容。