大型項目結構
大型項目結構
小項目可以簡單的只使用一個程序文件;大型項目需要更高效有序的結構,這是《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:https://docs.python.org/3/reference/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!。
推薦閱讀:
※拒絕撕逼,用數據來告訴你選擇器到底哪家強
※Django表單的三種玩法。
※Python科學計算與自動控制2-變數與簡單數據類型
※Python的在線學習地址?