這部分內容在《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!。