真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Django工程目錄結(jié)構(gòu)

Django 工程目錄結(jié)構(gòu)

創(chuàng)新互聯(lián)建站長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為和碩企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),和碩網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

你已經(jīng)配置好你的Heroku賬戶(譯者注:Heroku是一個(gè)老牌的免費(fèi)云空間),并且創(chuàng)建了第一個(gè)Heroku應(yīng)用,讓我們來(lái)討論一個(gè)非常重要的話題(雖然經(jīng)常被忽略):Django工程結(jié)構(gòu)管理。

概述

多數(shù)Django工程非?;靵y。不幸的是默認(rèn)的Django工程布局并沒(méi)有對(duì)此有任何幫助,它過(guò)于簡(jiǎn)單對(duì)工程的管理導(dǎo)致在處理大的工程時(shí)帶來(lái)很多維護(hù)性問(wèn)題。

本文將幫助讓你的工程有個(gè)合理的布局。致力于:

  • 遵循最佳實(shí)踐

  • 讓你的工程盡可能地直觀--你(作為開(kāi)發(fā)者)可以立即認(rèn)出代碼每個(gè)部分的作用

  • 讓你工程仍然保持規(guī)范隨著你的工程中的應(yīng)用越來(lái)越多。

  • 讓你工程在不同環(huán)境下部署更加方便

  • 讓其他程序員喜歡你的代碼

具體步驟

這部分我將和你一起開(kāi)始一個(gè)新的項(xiàng)目。過(guò)程中,你需要將你的項(xiàng)目目錄結(jié)構(gòu)調(diào)整為下面描述的布局。

本文描述了高維護(hù)性結(jié)構(gòu)分明的Django項(xiàng)目布局的最佳實(shí)踐。

基礎(chǔ)- 缺省的Django項(xiàng)目

在深入之前,讓我們創(chuàng)建一個(gè)新的Django項(xiàng)目(工程)

$django-admin.py startproject djanolicious
$cd djangolicious
$tree .
.
├── djangolicious
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

1個(gè)目錄,5個(gè)文件

在根目錄djangolicious下,可以得到:

  • 項(xiàng)目目錄:djangolicious

  • manage.py腳本:用于管理Django站點(diǎn)

在項(xiàng)目目錄djangolicious里包含:

  • settings.py: 包含項(xiàng)目的所有配置參數(shù)

  • urls.py: URL根配置

  • wsgi.py: 內(nèi)置runserver命令的WSGI應(yīng)用配置

  • __init__.py: 用來(lái)告訴python,當(dāng)前目錄是python模塊

管理項(xiàng)目需求說(shuō)明

首先我們?cè)陧?xiàng)目中新建一個(gè)文件:requirements.txt。每個(gè)Django項(xiàng)目都應(yīng)該有一個(gè)頂級(jí)的requirements.txt文件來(lái)列出項(xiàng)目中所有使用到的python包。

Note:如果你對(duì)于requirements文件不太熟悉,你可以閱讀Heroku指引 來(lái)通過(guò)pip管理python的需求關(guān)系。

requirement.txt中類(lèi)似如下內(nèi)容:

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

創(chuàng)建requirements文件是為了讓其他開(kāi)發(fā)者 拷貝你的項(xiàng)目代碼后可以快速地根據(jù)此文件中內(nèi)容安裝好必須的python依賴包。這樣他們可以方便地運(yùn)行你的代碼,而不必煞費(fèi)苦心地猜測(cè)項(xiàng)目依賴包的版本。

現(xiàn)在你知道為什么我們需要這么做了,照做吧!

第一步--模塊化

  在項(xiàng)目目錄中創(chuàng)建一個(gè)頂級(jí)的requirement.txt是必須遵循的要求,而且這樣可以保證可以方便地管理項(xiàng)目依賴關(guān)系

  這意味著:很有可能,項(xiàng)目的開(kāi)發(fā)環(huán)境依賴關(guān)系不同于你的生產(chǎn)環(huán)境,所有你需要將你的開(kāi)發(fā)和生產(chǎn)環(huán)境的依賴都放到requirement.txt中,但是這會(huì)使得管理起來(lái)比較困難。

  所以,最好是區(qū)分好不同環(huán)境的依賴和需求

  我們的做法如下(在項(xiàng)目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個(gè)目錄,10個(gè)文件

  可以看出,我新建了一個(gè)頂級(jí)目錄:requirements,包含一系列的需求說(shuō)明文件,分別針對(duì)每個(gè)環(huán)境。

  如果你的應(yīng)用只需要在開(kāi)發(fā)環(huán)境下運(yùn)行,那么只需要在一個(gè)dev.txt文件。如果你的應(yīng)用需要開(kāi)發(fā)、生產(chǎn)、測(cè)試、tom和rudy環(huán)境下運(yùn)行--那么就分別為他們創(chuàng)建一個(gè).txt文件

Note:common.txt內(nèi)含各種環(huán)境下共享的需求說(shuō)明。例如Django。所有環(huán)境下都需要Django,不管是開(kāi)發(fā)環(huán)境還是生產(chǎn)環(huán)境,你都需要使用它。

  將各類(lèi)需求文件分開(kāi)的目的是,當(dāng)作為程序員的我只需要在本地環(huán)境下運(yùn)行項(xiàng)目,那么我只需要安裝requirement/dev.txt中提到的軟件包,而不需要安裝其他的包(生產(chǎn)環(huán)境,staging,測(cè)試環(huán)境等等)

  但是為什么我這么關(guān)心哪些包是我必須安裝的?為什么我不將他們?nèi)堪惭b?

  • 安裝依賴包需要耗費(fèi)很長(zhǎng)時(shí)間,對(duì)于大型項(xiàng)目來(lái)說(shuō)可能會(huì)耗費(fèi)大塊的時(shí)間(30分鐘以上)。

  • 很多需求依賴于外部軟件或者庫(kù)文件按裝到你的本地機(jī)器來(lái)完成編譯。這么避免安裝庫(kù)文件可以節(jié)省時(shí)間還可以免去大量不必要的麻煩,比如要安裝哪個(gè)版本的libxml2和libpq-dev。

  • 降低了初學(xué)者學(xué)習(xí)的門(mén)檻。如果的你項(xiàng)目組來(lái)了一個(gè)新的開(kāi)發(fā),嘗試提交代碼,對(duì)他來(lái)說(shuō)安裝很少的軟件包就可以運(yùn)行系統(tǒng)要比安裝所有軟件包要簡(jiǎn)單的多。

第二步--定義需求文件

  現(xiàn)在我們明白了為什么要模塊化需求說(shuō)明文件,下面了解下實(shí)踐中需求說(shuō)明文件的具體內(nèi)容。

  下面我列出了4個(gè)從我實(shí)際項(xiàng)目中拿來(lái)的需求說(shuō)明文件,我將詳細(xì)的給予說(shuō)明。

  首先,requirements/common.txt文件列出了所有基本的需求包,其中的么個(gè)軟件包在任何環(huán)境都是必須的(不管是開(kāi)發(fā)環(huán)境,測(cè)試環(huán)境還是生產(chǎn)環(huán)境等的):

# 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文件包含了我的開(kāi)發(fā)環(huán)境所需要包,其中的包只有是在開(kāi)發(fā)環(huán)境下才會(huì)用到。

# requirements/dev.txt
-r common.txt
django-debug-toolbar==0.9.4

 在我的開(kāi)發(fā)環(huán)境,我通常使用輕量級(jí)的SQLite3數(shù)據(jù)庫(kù)(所以我不需要安裝任何驅(qū)動(dòng)程序),而且非常好用的包django-debug-toolbar可以允許我檢查數(shù)據(jù)庫(kù)查詢和性能問(wèn)題,等等。

  可能你會(huì)疑惑文件第一行的作用,'-r common.txt'告訴pip引入所有通用的依賴包附加到后面列舉內(nèi)容。

  這將允許我在命令行中直接運(yùn)行pip intal -r requirements/dev.txt來(lái)安裝開(kāi)發(fā)環(huán)境需要的所有依賴包:

$ 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 ...

從上面的運(yùn)行結(jié)果可以看出,非常好用!當(dāng)我們使用pip安裝requirements/dev.txt中包,它不僅成功安裝了開(kāi)發(fā)環(huán)境中需要的依賴包,同時(shí)也將common.txt中列舉的包都安裝好了!非常漂亮!

下面是一個(gè)簡(jiǎn)單的requirements/pord.txt需求說(shuō)明文件。其中包含了所有生產(chǎn)環(huán)境的依賴包和基本的依賴包:

# 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

最后,這是一個(gè)比較舊的requirements/test.txt文件,列出測(cè)試環(huán)境下的依賴包。這些包用于項(xiàng)目的單元測(cè)試環(huán)節(jié)。

# requirements/test.txt
-r common.txt
django-coverage==1.2.2
django-nose==0.1.3
mock==0.8.0
nosexcover==1.0.7
  • 當(dāng)我需要在本地開(kāi)發(fā)環(huán)境下運(yùn)行我的代碼,我就安裝requirements/dev.txt中的依賴包

  • 當(dāng)我在生產(chǎn)環(huán)境下運(yùn)行我的代碼,就安裝requirements/prod.txt中的依賴包

  • 當(dāng)我要針對(duì)我的代碼做一些測(cè)試的時(shí)候,我就安裝requirements/test.txt中的依賴包

重點(diǎn)在于將你的項(xiàng)目依賴文件按照以下原則來(lái)拆分:

  • 簡(jiǎn)單的

  • 高效的

  • 直觀的

第三步--Heroku最佳實(shí)踐

  現(xiàn)在,我們模塊化了我們的需求說(shuō)明文件。我敢說(shuō)你一定疑惑:為什么在項(xiàng)目根目錄下還有個(gè)requirement.txt的文件?

  原因如下:

  • 標(biāo)準(zhǔn)化要求存在requirements.txt文件

  • Heroku在你部署項(xiàng)目的時(shí)候會(huì)自動(dòng)讀取你根目錄下下的requirements.txt文件,并且將這些需求包安裝起來(lái)。

  Heroku會(huì)安裝你在requirements.txt中定義的所有包,你可以有多種選擇:

  • 讓Heroku安裝所有的依賴包:comon.txt,dev.txt,prod.txt等

  • 讓Heroku只安裝他需要的包

我們使用Heroku來(lái)部署我們的站點(diǎn),所有最好是讓Heroku只安裝必須的包。

因?yàn)镠eroku需要做的事情少了,這會(huì)讓我們部署后的項(xiàng)目更加快速。

打開(kāi)根目錄下的requirements.txt文件然后輸入以下內(nèi)容:


#Install all of our production dependencies only.
-r requirements/prod.txt

這樣Heroku就會(huì)安裝我們的要求來(lái)安裝需要的包。

分離應(yīng)用和庫(kù)文件

管理Django工程接下來(lái)的工作就是把你的應(yīng)用從庫(kù)中分離出來(lái)。

總所周知,每個(gè)Django工程包括一系列的應(yīng)用。有些應(yīng)用中包含模型和視圖等等。還有些是輔助性的應(yīng)用。

通常,這些輔助應(yīng)用用于自定義templatetag,管理命令以及一些其他代碼。請(qǐng)不要將這些放到別的應(yīng)用里面。

幸運(yùn)的沒(méi),有一種簡(jiǎn)單的方法來(lái)構(gòu)建的Django項(xiàng)目:

  • 開(kāi)發(fā)人員可以很容易地找到你的django應(yīng)用

  • 開(kāi)發(fā)人員可以很容易的找到你的django庫(kù)文件

  • 不要在你工程目錄下包含大量的自定義應(yīng)用,不要讓你的目錄結(jié)果混亂,而很難找到你想要的東西

我都會(huì)在每個(gè)Django工程的主目錄下創(chuàng)建兩個(gè)目錄:apps和libs用來(lái)各自存放應(yīng)用和庫(kù)文件。

再看我們的例子工程: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個(gè)目錄,12個(gè)文件

如上所示,我的djangolicious工程中包含了新的apps目錄和libs目錄。剩下的就是將Django應(yīng)用和庫(kù)移動(dòng)到合適的位置。

在djangolicious的例子中,我創(chuàng)建了一些django應(yīng)用和庫(kù),現(xiàn)在到時(shí)候?qū)jango應(yīng)用移動(dòng)到合適位置。

$ 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個(gè)目錄,32個(gè)文件

現(xiàn)在我們的工程已經(jīng)有了實(shí)際的架構(gòu)!已經(jīng)將django應(yīng)用和庫(kù)文件清晰地分開(kāi)了。這樣不僅很容易找到想要的應(yīng)用或者庫(kù),而且目錄結(jié)構(gòu)也是非常的清晰。

移動(dòng)應(yīng)用和庫(kù)文件后,還需要更新你的引入路徑。如果你之前的是這么寫(xiě)的:

# 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語(yǔ)句變長(zhǎng)了,我發(fā)現(xiàn)這對(duì)于我這個(gè)開(kāi)發(fā)者來(lái)找到我所引入的需要修改的app、librarie是很有幫助的。

你還需要更新你的settings文件來(lái)包含新的應(yīng)用的路徑:

# settings.py
INSTALLED_APPS = (
    ...
    'djangolicious.apps.blog',
    'djangolicious.apps.news',
    'djangolicious.apps.reader',
    ...
)

構(gòu)建一個(gè)完美的Django settings模塊

構(gòu)建完美的Django settings模塊被認(rèn)為是Django開(kāi)發(fā)的“必殺技”。每個(gè)開(kāi)發(fā)者都有著自己的想法,也可能會(huì)為此爭(zhēng)論。

然而,很多人的做法真實(shí)非常錯(cuò)誤的。

在此,我來(lái)展示了一種正確的方法來(lái)構(gòu)建完美的Django settings模塊,不管你工程的大小,需求以及其他因素。

我們所創(chuàng)建的settings模塊:

  • 允許你方便地分離Django各種環(huán)境(開(kāi)發(fā),生產(chǎn),測(cè)試等等)。

  • 允許你保持所有配置信息都在版本控制下。

  • 允許你通過(guò)環(huán)境變量將密碼和其他證書(shū)從基本代碼中分離出來(lái)。

  • 讓你可以方便地修改配置。

第一步--模塊化,模塊化,模塊化

就像我們?cè)谇懊娴恼鹿?jié)中處理需求說(shuō)明文件那樣,配置信息也需要模塊化!

首先,讓我們處理掉討厭的默認(rèn)settings.py,取而代之的是創(chuàng)建一個(gè)更好的目錄結(jié)構(gòu):

$ 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

和需求說(shuō)明文件一樣,settings模塊也應(yīng)該針對(duì)每個(gè)環(huán)境一個(gè)配置文件(dev.py,prod.py,test.py),和一個(gè)被各種環(huán)境共享的文件(common.py)。

資源

嚴(yán)格來(lái)說(shuō),管理Django工程發(fā)很需要技術(shù)。

然而我也還沒(méi)有很多好的書(shū)籍或者資料可以推薦給你。

要想更好地維護(hù)和管理工程,就需要你創(chuàng)建很多項(xiàng)目,并且持續(xù)地改進(jìn)你的代碼

其他資源:

譯者注:終于翻譯完了,內(nèi)容上基本沒(méi)有問(wèn)題,不會(huì)影響讀者理解,只是用詞確實(shí)不是太好,還望諒解

TOPIC

  • celery報(bào)錯(cuò) AttributeError: 'module' object has no attribute 'commit_manually'

  • django初始化數(shù)據(jù) django1.7 fixtures initial_data

  • windows 安裝fabric問(wèn)題

  • tornado模板轉(zhuǎn)義 echarts highcharts

  • notepad++運(yùn)行python程序

  • python urlencode

  • python獲取系統(tǒng)的ip地址

  • 外部python腳本調(diào)用django項(xiàng)目中的方法、模型等(setup_environ)

  • python讀取郵件并下載附件

  • python第多少周查詢及查詢每周的開(kāi)始日期

  • python list去重 重復(fù)記錄

  • django ORM實(shí)現(xiàn)原生sql的group_by查詢

  • Django 數(shù)據(jù)庫(kù)同步south使用

  • 快速定位linux系統(tǒng)中大文件

  • python xlrd處理excel文件

  • 利用django實(shí)現(xiàn)工作流

  • Django模板中select下拉框的顯示問(wèn)題

  • 遠(yuǎn)程Linux:VNC配置及修改

  • JS動(dòng)態(tài)控制HTML中元素隱藏或顯示

  • 獲取當(dāng)前日期為本年第多少周

  • Django form select標(biāo)簽出現(xiàn)"---------"

  • Django form中使用ueditor動(dòng)態(tài)設(shè)置只讀屬性

  • Django 將數(shù)據(jù)批量插入數(shù)據(jù)庫(kù)bulk_create()

  • Django登陸訪問(wèn)限制@login_required

  • Django Model choice

  • Python中*args與**args的區(qū)別

  • Django獲取checkbox勾選框的值(轉(zhuǎn)載)

  • Django不同app下views相互import問(wèn)題

  • 獲取Django model中字段名,字段的verbosename,字段類(lèi)型

  • Django1.6 自定義User模型

  • python實(shí)現(xiàn)數(shù)據(jù)庫(kù)增量備份

  • python時(shí)間處理

  • python處理JSON數(shù)據(jù)

  • Django model多對(duì)多字段查詢

  • MySQL常用基本操作


網(wǎng)頁(yè)標(biāo)題:Django工程目錄結(jié)構(gòu)
轉(zhuǎn)載注明:http://weahome.cn/article/ihgpgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部