這部分內容在《Flask Web開發》裡的相關章節講的很詳細,我就不重複了。在這裡總結一下重點,再補充一些其他東西。
大型專案結構
小專案可以簡單的只使用一個程式檔案;大型專案需要更高效有序的結構,這是《Flask Web開發》裡使用的結構:
|my_app
|-app/
|-templates/ 模板檔案
|-static/ 靜態檔案(css、js等)
|-main/
|-__init__。py 建立藍本
|-errors。py 錯誤處理
|-forms。py 表單類
|-views。py 路由
|-__init__。py 擴充套件和配置初始化、程式工廠函式、註冊藍本
|-email。py 郵件支援
|-models。py 資料庫模型
|-migrations/ 資料庫遷移指令碼
|-tests/ 測試
|-__init__。py
|-test*。py
|-venv/ 虛擬環境
|-requirements。txt 需求檔案
|-config。py 程式配置
|-manage。py 啟動指令碼
相對匯入
《Flask Web開發》後半部分的程式碼片段省略掉了匯入部分的內容,容易讓人產生疑惑。因為這裡使用包(Package)和模組(Module)來組織程式,所以使用了相對匯入。
相對匯入使用點來表示層級關係,一個點代表當前的包,兩個點表示上一層包,以此類推(不建議超過兩層)。引用PEP-328裡的例子做說明:
|package/
|__init__。py
|subpackage1/
|__init__。py
|moduleX。py
|moduleY。py
|subpackage2/
|__init__。py
|moduleZ。py
|moduleA。py
在moduleX。py裡,可以這樣匯入其他模組:
moduleX。py
from
。moduleY
import
spam
from
。moduleY
import
spam
as
ham
from
。
import
moduleY
from
。。subpackage1
import
moduleY
from
。。subpackage2。moduleZ
import
eggs
from
。。moduleA
import
foo
from
。。。package
import
bar
當你匯入某一個包內的模組,這個包裡的__init__。py會被自動執行,所以如果要匯入__init__。py中的內容,直接從該層包對應的點來匯入:
moduleX。py
from
。
import
spam
# subpackage1下的__init__。py
from
。。
import
spam
# package下的__init__。py
為了更好的組織模組並增加命名層次空間,Python引入了包,包是一個有__init__。py(包的構造檔案)檔案的資料夾,可以理解成一種特殊的模組(__init__。py檔案可以為空,也可以放一些初始化內容,它會在匯入包內模組時自動執行,
類似Python類的建構函式
)。
|app/
|one/
|__init__。py
|hello2。py
|hello。py
這裡的one資料夾就成了一個包,你可以在hello。py裡匯入one下面的hello2,使用點來表示層級關係:
from one。hello2 import spam
程式工廠函式和藍本
簡單來說,程式工廠函式就是一個用來建立程式例項的函式,即create_app(),在這個函數里完成擴充套件及配置的初始化操作,返回程式例項。使用程式工廠函式,我們可以延遲建立例項,在建立例項之前進行一些設定,還可以建立多個程式例項。
藍本類似程式例項,但更多的是用來組織程式。
藍本有很多重要作用。它可以更好的組織你的程式,比如把使用者認證系統和主程式分開,使用不同的URL字首,就像是劃分資料夾,把Python程式的各個部分放在不同的包裡一樣。可以為不同的藍本分配不同的模板資料夾和靜態檔案資料夾,設定不同的錯誤處理函式。和多個程式例項不同的是,它們(藍本)可以共享相同的配置和擴充套件。
相關連結
The import system:
https://
docs。python。org/3/refer
ence/import。html#the-import-system
PEP 328:
https://www。
python。org/dev/peps/pep
-0328/
Python 101: All about imports:
http://www。
blog。pythonlibrary。org/
2016/03/01/python-101-all-about-imports/
Application Factories:
http://
flask。pocoo。org/docs/0。
12/patterns/appfactories/
Modular Applications with Blueprints:
http://
flask。pocoo。org/docs/0。
12/blueprints/
- - - - -
更多關於Flask和Web開發的原創內容,歡迎關注知乎專欄 - Hello, Flask!。