Django 工程目錄結構
你已經配置好你的Heroku賬戶(譯者注:Heroku是一個老牌的免費云空間),并且創建了第一個Heroku應用,讓我們來討論一個非常重要的話題(雖然經常被忽略):Django工程結構管理。
概述
多數Django工程非?;靵y。不幸的是默認的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工程發很需要技術。
然而我也還沒有很多好的書籍或者資料可以推薦給你。
要想更好地維護和管理工程,就需要你創建很多項目,并且持續地改進你的代碼
其他資源:
譯者注:終于翻譯完了,內容上基本沒有問題,不會影響讀者理解,只是用詞確實不是太好,還望諒解
TOPIC
celery報錯 AttributeError: 'module' object has no attribute 'commit_manually'
django初始化數據 django1.7 fixtures initial_data
windows 安裝fabric問題
tornado模板轉義 echarts highcharts
notepad++運行python程序
python urlencode
python獲取系統的ip地址
外部python腳本調用django項目中的方法、模型等(setup_environ)
python讀取郵件并下載附件
python第多少周查詢及查詢每周的開始日期
python list去重 重復記錄
django ORM實現原生sql的group_by查詢
Django 數據庫同步south使用
快速定位linux系統中大文件
python xlrd處理excel文件
利用django實現工作流
Django模板中select下拉框的顯示問題
遠程Linux:VNC配置及修改
JS動態控制HTML中元素隱藏或顯示
獲取當前日期為本年第多少周
Django form select標簽出現"---------"
Django form中使用ueditor動態設置只讀屬性
Django 將數據批量插入數據庫bulk_create()
Django登陸訪問限制@login_required
Django Model choice
Python中*args與**args的區別
Django獲取checkbox勾選框的值(轉載)
Django不同app下views相互import問題
獲取Django model中字段名,字段的verbosename,字段類型
Django1.6 自定義User模型
python實現數據庫增量備份
python時間處理
python處理JSON數據
Django model多對多字段查詢
MySQL常用基本操作
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。