大型項目結構

這部分內容在《Flask Web開發》里的相關章節講的很詳細,我就不重複了。在這裡總結一下重點,再補充一些其他東西。

大型項目結構

小項目可以簡單的只使用一個程序文件;大型項目需要更高效有序的結構,這是《Flask Web開發》里使用的結構:

|my_appn |-app/n |-templates/ 模板文件n |-static/ 靜態文件(css、js等)n |-main/n |-__init__.py 創建藍本n |-errors.py 錯誤處理n |-forms.py 表單類n |-views.py 路由n |-__init__.py 擴展和配置初始化、程序工廠函數、註冊藍本 n |-email.py 郵件支持n |-models.py 資料庫模型n |-migrations/ 資料庫遷移腳本n |-tests/ 測試n |-__init__.pyn |-test*.pyn |-venv/ 虛擬環境n |-requirements.txt 需求文件n |-config.py 程序配置n |-manage.py 啟動腳本n

相對導入

《Flask Web開發》後半部分的代碼片段省略掉了導入部分的內容,容易讓人產生疑惑。因為這裡使用包(Package)和模塊(Module)來組織程序,所以使用了相對導入。

相對導入使用點來表示層級關係,一個點代表當前的包,兩個點表示上一層包,以此類推(不建議超過兩層)。引用PEP-328里的例子做說明:

|package/n |__init__.pyn |subpackage1/n |__init__.pyn |moduleX.pyn |moduleY.pyn |subpackage2/n |__init__.pyn |moduleZ.pyn |moduleA.pyn

在moduleX.py里,可以這樣導入其他模塊:

moduleX.py

from .moduleY import spamnfrom .moduleY import spam as hamnfrom . import moduleYnfrom ..subpackage1 import moduleYnfrom ..subpackage2.moduleZ import eggsnfrom ..moduleA import foonfrom ...package import barn

當你導入某一個包內的模塊,這個包里的__init__.py會被自動執行,所以如果要導入__init__.py中的內容,直接從該層包對應的點來導入:

moduleX.py

from . import spam # subpackage1下的__init__.pynfrom .. import spam # package下的__init__.pyn

為了更好的組織模塊並增加命名層次空間,Python引入了包,包是一個有__init__.py(包的構造文件)文件的文件夾,可以理解成一種特殊的模塊(__init__.py文件可以為空,也可以放一些初始化內容,它會在導入包內模塊時自動執行,類似Python類的構造函數)。

|app/n |one/n |__init__.pyn |hello2.pyn |hello.pyn

這裡的one文件夾就成了一個包,你可以在hello.py里導入one下面的hello2,使用點來表示層級關係:

from one.hello2 import spamn

程序工廠函數和藍本

簡單來說,程序工廠函數就是一個用來創建程序實例的函數,即create_app(),在這個函數里完成擴展及配置的初始化操作,返回程序實例。使用程序工廠函數,我們可以延遲創建實例,在創建實例之前進行一些設置,還可以創建多個程序實例。

藍本類似程序實例,但更多的是用來組織程序。

藍本有很多重要作用。它可以更好的組織你的程序,比如把用戶認證系統和主程序分開,使用不同的URL前綴,就像是劃分文件夾,把Python程序的各個部分放在不同的包里一樣。可以為不同的藍本分配不同的模板文件夾和靜態文件文件夾,設置不同的錯誤處理函數。和多個程序實例不同的是,它們(藍本)可以共享相同的配置和擴展。

相關鏈接

  • The import system:docs.python.org/3/refer

  • PEP 328:python.org/dev/peps/pep

  • Python 101: All about imports:blog.pythonlibrary.org/

  • Application Factories:flask.pocoo.org/docs/0.

  • Modular Applications with Blueprints:flask.pocoo.org/docs/0.

- - - - -

更多關於Flask和Web開發的原創內容,歡迎關注知乎專欄 - Hello, Flask!。


推薦閱讀:

拒絕撕逼,用數據來告訴你選擇器到底哪家強
Django表單的三種玩法。
Python科學計算與自動控制2-變數與簡單數據類型
Python的在線學習地址?

TAG:Flask | Python | Web开发 |