
# 組織你的項目
Flask會把項目組織的職責托付給你。
這是我喜歡使用Flask開始項目的其中一個理由,但是這意味著你不得不思考怎么組織你的代碼。
你可以把這個應用放到一個文件中,或者把它分割多個包。然而這兩種結構并不適合大多數項目。
這里有一些固定的組織模式,你可以遵循它們以便于開發和部署。
## 約定
在這一段中我想要先約定一些概念。
**版本庫(Repository)**:你的應用的根目錄。這個概念來自于版本控制系統,但在這里有所拓展。
當我在這一章提到“版本庫”時,指的是你的項目的根目錄。在開發你的應用時,你不太可能會離開這個目錄。
**包(Package)**:包含了你的應用代碼的一個包。在這一章,我將深入探討以包的形式建立你的應用,但是現在只需知道包是版本庫的一個子目錄。
**模塊(Module)**:一個模塊是一個簡單的,可以被其它Python文件引入的Python文件。一個包由多個模塊組成。
> **參見**
> * 在這里可以讀到更多的關于Python模塊的內容: http://docs.python.org/2/tutorial/modules.html
> * 這個鏈接中也有一節關于包的內容: http://docs.python.org/2/tutorial/modules.html#packages
## 組織模式
### 單一模塊
在許多Flask例子里,你會看到它們把所有的代碼放到一個單一文件中,通常是*app.py*。對于一些微(~~寫完就丟~~)項目來說這恰到好處,畢竟你只需要處理幾個路由(route)并且只有百來行代碼。(示例用的應用就是這樣)
單一模塊的應用的版本庫看起來像這樣:
```
app.py
config.py
requirements.txt
static/
templates/
```
在這個例子中,應用邏輯部分會存放在*app.py*
### 包
當你開始在一個變得更加復雜的項目上工作時,單一模塊就會造成嚴重的問題。
你需要為模型(model)和表單(form)定義多個類,而它們會跟你的路由和配置代碼又吵又鬧。所有的一切讓你焦頭爛額。
為了解決這個問題,我們得把應用中不同的組件分開到單獨的、高內聚的一組模塊 - 也即是包 - 之中。
基于包的應用的版本庫看起來就像是這樣:
```
config.py
requirements.txt
run.py
instance/
/config.py
yourapp/
/__init__.py
/views.py
/models.py
/forms.py
/static/
/templates/
```
這個結構允許你理智地整理你的應用的不同組件。
有關模型的類定義全待在*models.py*,而路由定義在*views.py*,有關表單的類定義全待在*forms.py*(我們等會會用整整一章的篇幅談談表單)。
下面的表格列舉了大多數Flask應用都有的基本組件。
對于你的應用,可能還需要別的一些文件,但這些適用于大多數Flask應用。
| 組件 | 作用 |
| ------------------ |-------------|
| run.py | 這個文件中用于啟動一個開發服務器。它從你的包獲得應用的副本并運行它。這不會在生產環境中用到,不過依然在許多Flask開發的過程中看到。 |
| requirements.txt | 這個文件列出了你的應用依賴的所有Python包。你可能需要把它分成生產依賴和開發依賴。[請看第三章] |
| config.py | 這個文件包含了你的應用需要的大多數配置變量 |
| instance/config.py | 這個文件包含不應該出現在版本控制的配置變量。其中有類似調用密鑰和數據庫URI連接密碼。同樣也包括了你的應用中特有的不能放到陽光下的東西。比如,你可能在*config.py*中設定`DEBUG = False`,但在你自己的開發機上的*instance/config.py*設置`DEBUG = True`。因為這個文件可以在*config.py*之后被載入,它將覆蓋掉`DEBUG = False`,并設置`DEBUG = True`。|
| yourapp/ | 這個包里包括了你的應用。|
| yourapp/\_\_init\_\_.py| 這個文件初始化了你的應用并把所有其它的組件組合在一起。|
| yourapp/views.py | 這里定義了路由。它也許需要作為一個包(*yourapp/views/*),由一些包含了緊密相聯的路由的模塊組成。|
| yourapp/models.py | 在這里定義了應用的模型。你可能需要像對待*views.py*一樣把它分割成許多模塊。|
| yourapp/static/ | 這個文件包括了公共CSS, Javascript, images和其他你想通過你的應用展示出去的靜態文件。默認情況下人們可以從*yourapp.com/static/*獲取這些文件。|
| yourapp/templates/ | 這里放置著你的應用的Jinja2模板。|
### Blueprints
有朝一日你可能會發覺應用里有許多相關的路由了。如果是我,我會首先把*views.py*分割成一個包并把相關的路由組織成模塊。
要是你已經這么做了,是時候把你的應用分解成[藍圖](http://docs.jinkan.org/docs/flask/blueprints.html)(blueprints)了
藍圖是按照一定程度上的自組織的方式,作為你的應用的一部分的組件。
它們表現得就像你的應用下的子應用一樣。你可能使用不同的藍圖來對應管理面板(admin panel),前端(front-end)和用戶面板(user dashboard)。
這使得你按照組件組織視圖,靜態文件和模板,并在組件間共享模型,表單和你的應用的其他部分。
你可以在第7章閱讀到關于藍圖的更多內容。
## 總結
* 對于微應用,建議使用單一模塊結構。
* 對于包含了視圖,模型,表單以及更多的項目,使用包結構。
* 藍圖是把項目按照一些不同的組件組織起來的好辦法。