1.我看到這篇文章,寫的不錯,在此複製了一份,防止之後找不到!
感謝做者的翻譯--->原文的連接:http://www.loonapp.com/blog/11/
若是原文存在,請打開原文件閱讀
偶然看到一份關於Django工程目錄的文章,英文版版的,以爲寫得不錯。在此翻譯下供讀者參考
Django 工程目錄結構
你已經配置好你的Heroku帳戶(譯者注:Heroku是一個老牌的免費雲空間),而且建立了第一個Heroku應用,讓咱們來討論一個很是重要的話題(雖然常常被忽略):Django工程結構管理。
概述
多數Django工程很是混亂。不幸的是默認的Django工程佈局並無對此有任何幫助,它過於簡單對工程的管理致使在處理大的工程時帶來不少維護性問題。
本文將幫助讓你的工程有個合理的佈局。致力於:
遵循最佳實踐
讓你的工程儘量地直觀--你(做爲開發者)能夠當即認出代碼每一個部分的做用
讓你工程仍然保持規範隨着你的工程中的應用愈來愈多。
讓你工程在不一樣環境下部署更加方便
讓其餘程序員喜歡你的代碼
具體步驟
這部分我將和你一塊兒開始一個新的項目。過程當中,你須要將你的項目目錄結構調整爲下面描述的佈局。
本文描述了高維護性結構分明的Django項目佈局的最佳實踐。
基礎- 缺省的Django項目
在深刻以前,讓咱們建立一個新的Django項目(工程)
$django-admin.py startproject djanolicious
$cd djangolicious
$tree .
.
├── djangolicious
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
1個目錄,5個文件
在根目錄djangolicious下,能夠獲得:
項目目錄:djangolicious
manage.py腳本:用於管理Django站點
在項目目錄djangolicious裏包含:
settings.py: 包含項目的全部配置參數
urls.py: URL根配置
wsgi.py: 內置runserver命令的WSGI應用配置
__init__.py: 用來告訴python,當前目錄是python模塊
如今讓咱們來看下一個工程的基本架構,讓咱們來作些改進。
管理項目需求說明
首先咱們在項目中新建一個文件:requirements.txt。每一個Django項目都應該有一個頂級的requirements.txt文件來列出項目中全部使用到的python包。
Note:若是你對於requirements文件不太熟悉,你能夠閱讀Heroku指引 來經過pip管理python的需求關係。
requirement.txt中相似以下內容:
Django==1.6
psycopy2==2.4.5
South==0.7.3
gunicorn==0.14.1
nrerelic==1.2.0.246
django-cerlery==2.4.2
建立requirements文件是爲了讓其餘開發者 拷貝你的項目代碼後能夠快速地根據此文件中內容安裝好必須的python依賴包。這樣他們能夠方便地運行你的代碼,而沒必要煞費苦心地猜想項目依賴包的版本。
如今你知道爲何咱們須要這麼作了,照作吧!
第一步--模塊化
在項目目錄中建立一個頂級的requirement.txt是必須遵循的要求,並且這樣能夠保證能夠方便地管理項目依賴關係
這意味着:頗有可能,項目的開發環境依賴關係不一樣於你的生產環境,全部你須要將你的開發和生產環境的依賴都放到requirement.txt中,可是這會使得管理起來比較困難。
因此,最好是區分好不一樣環境的依賴和需求
咱們的作法以下(在項目djangolicious根目錄下):
$ls
djangolicious manage.py
$touch requirements.txt
$mkdir requirements
$touch requirements/{common.txt,dev.txt,prod.txt,test.txt}
$tree.
.
|-- djangolicious
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| |-- wsgi.py
|-- manage.py
|-- requirements
| |-- common.txt
| |-- dev.txt
| |-- prod.txt
| |-- test.txt
|-- requirements.txt
2個目錄,10個文件
能夠看出,我新建了一個頂級目錄:requirements,包含一系列的需求說明文件,分別針對每一個環境。
若是你的應用只須要在開發環境下運行,那麼只須要在一個dev.txt文件。若是你的應用須要開發、生產、測試、tom和rudy環境下運行--那麼就分別爲他們建立一個.txt文件
Note:common.txt內含各類環境下共享的需求說明。例如Django。全部環境下都須要Django,不論是開發環境仍是生產環境,你都須要使用它。
將各種需求文件分開的目的是,看成爲程序員的我只須要在本地環境下運行項目,那麼我只須要安裝requirement/dev.txt中提到的軟件包,而不須要安裝其餘的包(生產環境,staging,測試環境等等)
可是爲何我這麼關心哪些包是我必須安裝的?爲何我不將他們所有安裝?
安裝依賴包須要耗費很長時間,對於大型項目來講可能會耗費大塊的時間(30分鐘以上)。
不少需求依賴於外部軟件或者庫文件按裝到你的本地機器來完成編譯。這麼避免安裝庫文件能夠節省時間還能夠免去大量沒必要要的麻煩,好比要安裝哪一個版本的libxml2和libpq-dev。
下降了初學者學習的門檻。若是的你項目組來了一個新的開發,嘗試提交代碼,對他來講安裝不多的軟件包就能夠運行系統要比安裝全部軟件包要簡單的多。
第二步--定義需求文件
如今咱們明白了爲何要模塊化需求說明文件,下面瞭解下實踐中需求說明文件的具體內容。
下面我列出了4個從我實際項目中拿來的需求說明文件,我將詳細的給予說明。
首先,requirements/common.txt文件列出了全部基本的需求包,其中的麼個軟件包在任何環境都是必須的(不論是開發環境,測試環境仍是生產環境等的):
# requirements/common.txt
Django==1.4
django-cache-machine==0.6
django-celery==2.5.5
django-dajaxice==0.2
django-guardian==1.0.4
django-kombu==0.9.4
django-pagination==1.0.7
django-sorting==0.1
django-tastypie==0.9.11
Fabric==1.4.1
lxml==2.3.4
pyst2==0.4
South==0.7.4
Sphinx==1.1.3
下面的requirements/dev.txt文件包含了個人開發環境所須要包,其中的包只有是在開發環境下才會用到。
# requirements/dev.txt
-r common.txt
django-debug-toolbar==0.9.4
在個人開發環境,我一般使用輕量級的SQLite3數據庫(因此我不須要安裝任何驅動程序),並且很是好用的包django-debug-toolbar能夠容許我檢查數據庫查詢和性能問題,等等。
可能你會疑惑文件第一行的做用,'-r common.txt'告訴pip引入全部通用的依賴包附加到後面列舉內容。
這將容許我在命令行中直接運行pip intal -r requirements/dev.txt來安裝開發環境須要的全部依賴包:
$ pip install -r requirements/dev.txt
Downloading/unpacking Django==1.4 (from -r requirements/common.txt (line 1))
Downloading Django-1.4.tar.gz (7.6Mb): 7.6Mb downloaded
Running setup.py egg_info for package Django
Downloading/unpacking django-cache-machine==0.6 (from -r requirements/common.txt (line 2))
Downloading django-cache-machine-0.6.tar.gz
Running setup.py egg_info for package django-cache-machine
... snipped for brevity ...
從上面的運行結果能夠看出,很是好用!當咱們使用pip安裝requirements/dev.txt中包,它不只成功安裝了開發環境中須要的依賴包,同時也將common.txt中列舉的包都安裝好了!很是漂亮!
下面是一個簡單的requirements/pord.txt需求說明文件。其中包含了全部生產環境的依賴包和基本的依賴包:
# requirements/prod.txt
-r common.txt
boto==2.1.1
cssmin==0.1.4
django-compressor==1.1.2
django-htmlmin==0.5.1
django-pylibmc-sasl==0.2.4
django-storages==1.1.3
gunicorn==0.14.1
newrelic==1.2.0.246
psycopg2==2.4.5
pylibmc==1.2.2
raven==1.3.5
slimit==0.6
最後,這是一個比較舊的requirements/test.txt文件,列出測試環境下的依賴包。這些包用於項目的單元測試環節。
# requirements/test.txt
-r common.txt
django-coverage==1.2.2
django-nose==0.1.3
mock==0.8.0
nosexcover==1.0.7
當我須要在本地開發環境下運行個人代碼,我就安裝requirements/dev.txt中的依賴包
當我在生產環境下運行個人代碼,就安裝requirements/prod.txt中的依賴包
當我要針對個人代碼作一些測試的時候,我就安裝requirements/test.txt中的依賴包
重點在於將你的項目依賴文件按照如下原則來拆分:
簡單的
高效的
直觀的
第三步--Heroku最佳實踐
如今,咱們模塊化了咱們的需求說明文件。我敢說你必定疑惑:爲何在項目根目錄下還有個requirement.txt的文件?
緣由以下:
標準化要求存在requirements.txt文件
Heroku在你部署項目的時候會自動讀取你根目錄下下的requirements.txt文件,而且將這些需求包安裝起來。
Heroku會安裝你在requirements.txt中定義的全部包,你能夠有多種選擇:
讓Heroku安裝全部的依賴包:comon.txt,dev.txt,prod.txt等
讓Heroku只安裝他須要的包
咱們使用Heroku來部署咱們的站點,全部最好是讓Heroku只安裝必須的包。
由於Heroku須要作的事情少了,這會讓咱們部署後的項目更加快速。
打開根目錄下的requirements.txt文件而後輸入如下內容:
#Install all of our production dependencies only.
-r requirements/prod.txt
這樣Heroku就會安裝咱們的要求來安裝須要的包。
分離應用和庫文件
管理Django工程接下來的工做就是把你的應用從庫中分離出來。
總所周知,每一個Django工程包括一系列的應用。有些應用中包含模型和視圖等等。還有些是輔助性的應用。
一般,這些輔助應用用於自定義templatetag,管理命令以及一些其餘代碼。請不要將這些放到別的應用裏面。
幸運的沒,有一種簡單的方法來構建的Django項目:
開發人員能夠很容易地找到你的django應用
開發人員能夠很容易的找到你的django庫文件
不要在你工程目錄下包含大量的自定義應用,不要讓你的目錄結果混亂,而很難找到你想要的東西
我都會在每一個Django工程的主目錄下建立兩個目錄:apps和libs用來各自存放應用和庫文件。
再看咱們的例子工程:djangolicious,個人作法以下:
$ mkdir djangolicious/apps
$ mkdir djangolicious/libs
$ touch djangolicious/apps/__init__.py
$ touch djangolicious/libs/__init__.py
$ tree .
.
├── djangolicious
│ ├── apps
│ │ └── __init__.py
│ ├── __init__.py
│ ├── libs
│ │ └── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements
│ ├── common.txt
│ ├── dev.txt
│ ├── prod.txt
│ └── test.txt
└── requirements.txt
4個目錄,12個文件
如上所示,個人djangolicious工程中包含了新的apps目錄和libs目錄。剩下的就是將Django應用和庫移動到合適的位置。
在djangolicious的例子中,我建立了一些django應用和庫,如今到時候將django應用移動到合適位置。
$ cd djangolicious/apps
$ django-admin.py startapp blog
$ django-admin.py startapp reader
$ django-admin.py startapp news
$ cd ../libs
$ django-admin.py startapp management
$ django-admin.py startapp display
$ cd ../..
$ tree .
.
├── djangolicious
│ ├── apps
│ │ ├── blog
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── tests.py
│ │ │ └── views.py
│ │ ├── __init__.py
│ │ ├── news
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── tests.py
│ │ │ └── views.py
│ │ └── reader
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── __init__.py
│ ├── libs
│ │ ├── display
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── tests.py
│ │ │ └── views.py
│ │ ├── __init__.py
│ │ └── management
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements
│ ├── common.txt
│ ├── dev.txt
│ ├── prod.txt
│ └── test.txt
└── requirements.txt
9個目錄,32個文件
如今咱們的工程已經有了實際的架構!已經將django應用和庫文件清晰地分開了。這樣不只很容易找到想要的應用或者庫,並且目錄結構也是很是的清晰。
移動應用和庫文件後,還須要更新你的引入路徑。若是你以前的是這麼寫的:
# blog/views.py
from djangolicious.news.models import Newspaper
from djangolicious.display.templatetags import top_stories
那麼你須要改爲:
# blog/views.py
from djangolicious.apps.news.models import Newspaper
from djangolicious.libs.display.templatetags import top_stories
儘管import語句變長了,我發現這對於我這個開發者來找到我所引入的須要修改的app、librarie是頗有幫助的。
你還須要更新你的settings文件來包含新的應用的路徑:
# settings.py
INSTALLED_APPS = (
...
'djangolicious.apps.blog',
'djangolicious.apps.news',
'djangolicious.apps.reader',
...
)
構建一個完美的Django settings模塊
構建完美的Django settings模塊被認爲是Django開發的「必殺技」。每一個開發者都有着本身的想法,也可能會爲此爭論。
然而,不少人的作法真實很是錯誤的。
在此,我來展現了一種正確的方法來構建完美的Django settings模塊,無論你工程的大小,需求以及其餘因素。
咱們所建立的settings模塊:
容許你方便地分離Django各類環境(開發,生產,測試等等)。
容許你保持全部配置信息都在版本控制下。
容許你經過環境變量將密碼和其餘證書從基本代碼中分離出來。
讓你能夠方便地修改配置。
第一步--模塊化,模塊化,模塊化
就像咱們在前面的章節中處理需求說明文件那樣,配置信息也須要模塊化!
首先,讓咱們處理掉討厭的默認settings.py,取而代之的是建立一個更好的目錄結構:
$ rm djangolicious/settings.py
$ mkdir djangolicious/settings
$ touch djangolicious/settings/{__init__.py,common.py,dev.py,prod.py,test.py}
$ tree .
.
├── djangolicious
│ ├── apps
│ │ ├── blog
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── tests.py
│ │ │ └── views.py
│ │ ├── __init__.py
│ │ ├── news
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── tests.py
│ │ │ └── views.py
│ │ └── reader
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── __init__.py
│ ├── libs
│ │ ├── display
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── tests.py
│ │ │ └── views.py
│ │ ├── __init__.py
│ │ └── management
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── settings
│ │ ├── common.py
│ │ ├── dev.py
│ │ ├── __init__.py
│ │ ├── prod.py
│ │ └── test.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements
│ ├── common.txt
│ ├── dev.txt
│ ├── prod.txt
│ └── test.txt
└── requirements.txt
和需求說明文件同樣,settings模塊也應該針對每一個環境一個配置文件(dev.py,prod.py,test.py),和一個被各類環境共享的文件(common.py)。
資源
嚴格來講,管理Django工程發很須要技術。
然而我也尚未不少好的書籍或者資料能夠推薦給你。
要想更好地維護和管理工程,就須要你建立不少項目,而且持續地改進你的代碼