全面剖析Python的Django框架中的項(xiàng)目部署技巧第1/2頁(yè)
項(xiàng)目開始時(shí)是一個(gè)關(guān)鍵時(shí)刻,選擇會(huì)對(duì)項(xiàng)目產(chǎn)生長(zhǎng)期的影響。有很多關(guān)于如何開始使用Django框架的教程,但很少討論如何專業(yè)地使用Django,或如何使用行業(yè)公認(rèn)的最佳做法來確保你的項(xiàng)目規(guī)模的持續(xù)增長(zhǎng)。事前的籌劃讓你(和所有同事的生活)在走向?qū)頃r(shí)更容易。
文章結(jié)束時(shí),你將有
- 一個(gè)全功能的Django 1.6項(xiàng)目
- 源代碼受控的所有資源(使用Git或Mercurial)
- 自動(dòng)回歸和單元測(cè)試(使用unittest庫(kù))
- 一個(gè)獨(dú)立于特定環(huán)境的安裝項(xiàng)目(使用virtualenv)
- 自動(dòng)化的部署和測(cè)試(使用Fabric)
- 自動(dòng)數(shù)據(jù)庫(kù)遷移 (使用South)
- 一個(gè)標(biāo)度你站點(diǎn)的開發(fā)工作流程
除第一部在官方教程中外其他部分教程里都沒有。它們應(yīng)該這樣。如果你想開始一個(gè)新的、生產(chǎn)就緒的Django 1.6項(xiàng)目,請(qǐng)繼續(xù)往下看。
先決條件
假定你已了解Python的基本知識(shí),同時(shí),以往的一些Django經(jīng)驗(yàn)會(huì)有幫助,但這不是必要的。你需要git或Mercurial來進(jìn)行版本控制。就這些!
準(zhǔn)備安裝
我假設(shè)你已經(jīng)安裝了Python。如果你沒有的話到python.org找到與你系統(tǒng)架構(gòu)相符的版本下載安裝。我使用一個(gè)Linode上的64位的Ubuntu服務(wù)器,我很高興使用Linode的服務(wù)。
那么,第一步是什么呢?安裝Django?不完全是。將安裝包直接安裝到你當(dāng)前的site-packages里有一個(gè)常見的問題:如果你的機(jī)器上有一個(gè)以上的Python項(xiàng)目使用Django等其他庫(kù),你可能會(huì)碰到應(yīng)用和安裝軟件庫(kù)之間依賴性的問題。因此,我們將使用virtualenv和它的延展virtualenvwrapper來管理我們的Django安裝。這是Python和Django用戶的實(shí)踐建議。
如果你使用pip來安裝第三方庫(kù)(我不明白你為什么不),你可以通過簡(jiǎn)單的操作安裝virtualenv和virtualenvwrapper。
$ pip install virtualenvwrapper
安裝完后,將下附內(nèi)容添加到你的shell啟動(dòng)配置文件中(.zshrc、.bashrc、.profile等)
重載一下你的啟動(dòng)配置文件(source .zshrc),現(xiàn)在你已經(jīng)就緒了。
創(chuàng)建一個(gè)新環(huán)境
創(chuàng)建一個(gè)虛擬環(huán)境很簡(jiǎn)單,只需輸入
$ mkvirtualenv django_project
“django_project”是你的項(xiàng)目的命名。
你會(huì)注意到立馬發(fā)生的一些事情:
你的shell前面加上了“(django_project)”
distribute和pip被自動(dòng)安裝了
這里是virtualenvwrapper的一個(gè)很有用的部分:它會(huì)自動(dòng)為你準(zhǔn)備好環(huán)境,讓你馬上可以使用pip安裝庫(kù)?!埃╠jango_project)”的部分是提醒你正在使用的是virtualenv而不是你系統(tǒng)上的Python。要退出虛擬環(huán)境只需簡(jiǎn)單輸入deactivate即可。當(dāng)你要回到你的項(xiàng)目開始工作時(shí),只需使用workon django_project即可。需要注意的是這與vanilla virtualenv工具不同,在哪里運(yùn)行這些命令都可以。
安裝Django
“等一下,‘安裝Django'?我已經(jīng)安裝Django了!”,太好了。不過你不會(huì)用它的。相反,我們將使用機(jī)器上的一個(gè)被virtualenv管理的且不會(huì)被其他用戶(或你自己)弄亂的Django安裝。在virtualenv中安裝Django,只需輸入:
$ pip install django
這樣最新版的Django將被安裝在你的virtualenv環(huán)境里,你可以這樣確認(rèn):
$ which django-admin.py
這會(huì)指出你的$HOME/.virtualenvs/目錄。如果沒有的話,確認(rèn)你的輸入提示里有“(django_project)”。如果沒有,使用workon django_project激活virtualenv。
建立項(xiàng)目
在我們真正開始這個(gè)項(xiàng)目之前,我們先來談一談。我在過去的幾年里咨詢過很多Django/Python項(xiàng)目并且和許多開發(fā)者討論過。一個(gè)具有壓倒性的事實(shí)是,那些具有最多困難的事情往往都沒有使用任何的版本控制。這聽起來讓人難以置信(想想GitHub的流行程度吧),但是開發(fā)者們根本不會(huì)去接觸版本控制。也有一些人認(rèn)為"這是個(gè)小項(xiàng)目",沒有必要使用版本控制。這是錯(cuò)誤的。
這里列出的工具不會(huì)讓你為了使用版本控制而增加更多額外的支出。
之前,我只提到過git作為(D)VCS。但是,既然這個(gè)項(xiàng)目是Python寫的,Mercurial也是一個(gè)基于Python的不錯(cuò)的選擇。因?yàn)閮烧叨急容^流行,所以你能找到許多在線學(xué)習(xí)資源。確保你已經(jīng)安裝了git或者M(jìn)ercurial。兩者都可以通過你的distro's packaging系統(tǒng)獲取它們。
如果你打算用git,GitHub顯然是一個(gè)很好的選擇可以把你的代碼保存到遠(yuǎn)程倉(cāng)庫(kù)里。使用Mercurial的話, Atlassian的Bitbucket是一個(gè)不錯(cuò)的選擇(它也支持git,所以你用git或者M(jìn)ercurial都行)
(源碼)控制你的環(huán)境
即使我們還沒真正做什么,但我們知道我們想讓所有東西都在源碼控制下。我們有兩類“東西”將提交:你的代碼本身(包括模板,等等)和支持文件,像數(shù)據(jù)庫(kù)夾具、South遷移(以后會(huì)更多)和requirements.txt文件,列出你的項(xiàng)目依賴的所有包,允許自動(dòng)構(gòu)建環(huán)境(不需要再次使用pip install安裝所有包)。
讓我們開始創(chuàng)建我們的項(xiàng)目文件夾。使用django-admin.py提供的startproject命令來設(shè)置。
$ django-admin.py startproject django_project
我們將看到創(chuàng)建了一個(gè)單獨(dú)的文件夾:django_project。在django_project文件夾內(nèi),我們將看到 另一個(gè)包含了常見元素的django_project文件夾:setting.py,urls.py和wsgi.py。在第二個(gè)django_project文件夾的同一級(jí)內(nèi)有manage.py文件。
插曲:項(xiàng)目vs.應(yīng)用程序
你也許會(huì)好奇,在Django1.4中,為什么已經(jīng)有了新建應(yīng)用程序的命令還要增加新建項(xiàng)目的命令。答案在于Django“項(xiàng)目”和Django“應(yīng)用程序”的區(qū)別。簡(jiǎn)單來說,一個(gè)項(xiàng)目是一套完整的網(wǎng)站或者應(yīng)用。一個(gè)“應(yīng)用程序”是一個(gè)可以用在任何Django項(xiàng)目中的很小的、(希望是)獨(dú)立的Django應(yīng)用。如果你正在構(gòu)建一個(gè)叫做“超級(jí)博客”的博客應(yīng)用,那么“超級(jí)博客”就是你的Django項(xiàng)目。如果“超級(jí)博客”支持讀者投票,那“投票”就是被“超級(jí)博客“使用的一個(gè)Django應(yīng)用程序。這個(gè)概念就是需要你的投票應(yīng)用程序可以應(yīng)用在其他需要用戶投票的Django項(xiàng)目中,而不是僅能應(yīng)用在”超級(jí)博客“項(xiàng)目中。一個(gè)項(xiàng)目就是一堆應(yīng)用程序按照項(xiàng)目特定的邏輯構(gòu)建的一個(gè)集合。一個(gè)應(yīng)用程序可以應(yīng)用在多個(gè)項(xiàng)目中。
盡管你會(huì)本能地傾向于在你的“投票”應(yīng)用程序中包含大量"超級(jí)博客"的特定代碼和信息,但避免這樣有許多好處。基于松耦合的原理,將你的應(yīng)用編寫為一個(gè)獨(dú)立的實(shí)體可以保持設(shè)計(jì)意圖,并且可以避免項(xiàng)目里的bug直接影響到你的應(yīng)用。這也意味著,如果你希望的話,你可以把你的任何應(yīng)用程序發(fā)給另一個(gè)開發(fā)者,且他們不需要訪問或更改你的主項(xiàng)目。
像軟件開發(fā)中的許多事情一樣,這需要一點(diǎn)付出,但回報(bào)很豐厚。
創(chuàng)建倉(cāng)庫(kù)
現(xiàn)在我們的項(xiàng)目里已經(jīng)有一些“代碼”了(確實(shí)來說只是一些股票腳本和空的配置文件,恕我這樣說),現(xiàn)在是我們初始我們?cè)创a控制庫(kù)再好不過的時(shí)間了。下面是在Git和Mercurial中實(shí)現(xiàn)的步驟。
git
$ git init
這條命令在當(dāng)前目錄創(chuàng)建了一個(gè)git倉(cāng)庫(kù)。將我們所有的文件添加到git以便提交。
$ git add django_project
現(xiàn)在,我們將代碼切實(shí)提交到我們的新庫(kù)中:
$ git commit -m 'Initial commit of django_project'
Mercurial
$ hg init
這條命令在當(dāng)前目錄創(chuàng)建了一個(gè)Mercurial倉(cāng)庫(kù)。將我們所有的文件添加到git以便提交。
$ hg add django_project
現(xiàn)在,我們將代碼切實(shí)提交到我們的新庫(kù)中:
$ hg commit -m 'Initial commit of django_project'
如果你打算使用像GitHub或者Bitbucket,現(xiàn)在是時(shí)候把代碼push上去了。
使用South進(jìn)行數(shù)據(jù)庫(kù)遷移
Django中最令人沮喪的特性之一是管理模型的變化和數(shù)據(jù)庫(kù)的相關(guān)變化。有了South的幫助,你可以實(shí)現(xiàn)創(chuàng)建一個(gè)完整的應(yīng)用,而不需要寫具體的數(shù)據(jù)庫(kù)代碼。South會(huì)創(chuàng)建一個(gè)遷移文件來檢測(cè)你的模型變化,并自動(dòng)在數(shù)據(jù)庫(kù)中生成。這使得你既可以前向根據(jù)最新變化來遷移數(shù)據(jù)庫(kù),又可以后向取消一個(gè)變化或者一系列變化。它讓你的生活如此簡(jiǎn)單,Django發(fā)行版沒有包含它真讓人吃驚。
何時(shí)開始使用South
在前面的文章中,我建議在項(xiàng)目的一開始就使用South。對(duì)于相對(duì)簡(jiǎn)單的項(xiàng)目而已,這挺好。然而,如果在你的原型中有大量的模型有很大的變化,那現(xiàn)在不是使用South的時(shí)候。對(duì)應(yīng)的,僅僅丟掉并在需要時(shí)重建數(shù)據(jù)庫(kù)。你可以編寫腳本來構(gòu)成擁有一些測(cè)試數(shù)據(jù)的數(shù)據(jù)庫(kù),并在需要時(shí)編輯它們。然而,一旦你的模型不再變化,盡快開始使用South。這很簡(jiǎn)單:
./manage.py convert_to_south <app_name>
安裝和設(shè)置
仍然在我們的虛擬環(huán)境下,像這樣安裝South:
$ pip install south
我們?cè)陧?xiàng)目的settings.py文件中把South添加到INSTALLED_APS中?,F(xiàn)在就添加,包括你的項(xiàng)目中的數(shù)據(jù)庫(kù)設(shè)置,然后運(yùn)行python manage.py syncdb。你將需要提升權(quán)限使用超級(jí)用戶名和密碼(你可以輸入然后回車)。更重要的是,South已經(jīng)在數(shù)據(jù)庫(kù)中設(shè)置好了它需要用的表格。
你可能認(rèn)識(shí)到我們并沒有在項(xiàng)目中添加應(yīng)用,而只是運(yùn)行了 syncdb。先這樣做可以讓 South 在一開始的時(shí)候就被安裝。使用 South,在我們應(yīng)用中的所有遷移工作都可以完成,包括初始遷移。
由于我們剛剛完成了很多變更,現(xiàn)在將是一個(gè)提交的好時(shí)間。你得適應(yīng)頻繁的提交,要知道,提交的粒度越小,在出錯(cuò)時(shí)回退的自由度越高。
要進(jìn)行提交操作,讓我們看看都有那些修改。
(git)
$ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) ## modified: django_project/settings.py ## Untracked files: # (use "git add <file>..." to include in what will be committed) ## django_project/.settings.py.swp # django_project/__init__.pyc # django_project/settings.pyc
(Mercurial)
$ hg status M django_project/django_project/settings.py ? django_project/django_project/.settings.py.swp ? django_project/django_project/__init__.pyc ? django_project/django_project/settings.pyc
使用 git 和 Mercurial,你可能發(fā)現(xiàn)一些你永遠(yuǎn)都不希望提交的文件,例如上面出現(xiàn)的 python 編譯 后的 .pyc 文件,以及 vim 的.swp 交換文件。要忽略這些文件,在項(xiàng)目的根目錄中創(chuàng)建一個(gè) .gitignore 或 .hgignore 文件,并在其中添加匹配你不希望追蹤的文件的 shell 模式。例如,我的文件內(nèi)容多半就是:
?
在我們提交之前,還有一個(gè)信息需要查看:我們已經(jīng)安裝的 Python 包。我們希望能夠追蹤使用到的 Python 包的名稱和版本,這樣一來,我們就可以輕松的重建生產(chǎn)環(huán)境。pip 正好有個(gè)命令可以完成我們這個(gè)需求。
$ pip freeze > requirements.txt
我將 pip 的輸出存入名為 requirements.txt 的文件,并將這個(gè)文件添加到代碼控制中。這樣,我們總是擁有一個(gè)更新的列表,里面包含了將使用的包。
現(xiàn)在將 settings.py 及 requirements.txt 添加到提交文件中,并提交:
$ (git/hg) add django_project/settings.py requirements.txt $ (git/hg) commit -m 'Added South for database migrations'
新型設(shè)置
隨著開發(fā)者對(duì)Django和Python越來越舒適,他們會(huì)發(fā)覺settings.py就是個(gè)簡(jiǎn)單的Python腳本,因此可以“編寫”。對(duì)settings.py的一個(gè)常見方式是從一個(gè)頗為古怪的項(xiàng)目文件夾移動(dòng)到一個(gè)新的叫做conf或者config的文件夾。要清楚你需要對(duì)manage.py做些小改變來適應(yīng)這個(gè)移動(dòng)。
在setting.py內(nèi),INSTALLED_APPS會(huì)很快變成一堆第三方的包,自身django應(yīng)用和項(xiàng)目特定的應(yīng)用。我習(xí)慣把INSTALLED_APPS分成三個(gè)類別:
- DEFAULT_APPS:作為默認(rèn)Django安裝(像admin)的一部分的Django框架應(yīng)用
- THIRD_PARTY_APPS:像South
- LOCAL_APPS:你創(chuàng)建的應(yīng)用
這可以更容易的看出哪些是你使用的第三方應(yīng)用,哪些是項(xiàng)目自身的。僅僅記住最后有一行和下面相似的代碼:
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
否則,Django將會(huì)出現(xiàn)沒有定義INSTALLED_APPS的錯(cuò)誤。
創(chuàng)建我們的應(yīng)用
以正常的方式使用manage.py來創(chuàng)建一個(gè)應(yīng)用(python manage.py startapp myapp),并把它加入到INSTALLED_APP中。同時(shí),花費(fèi)時(shí)間讓manage.py可執(zhí)行(chmod +x manage.py),這樣你就可以僅僅輸入./manage.py <command>,而不需要總是輸入python manage.py <command>。老實(shí)說,很少有開發(fā)者這么做。我無法搞清楚為什么。
在添加模型前,我們要做的第一件事是我們告訴South我們想用它做遷移:
$ python manage.py schemamigration myapp --initial
這將創(chuàng)建一個(gè)移植文件,用來應(yīng)用我們對(duì)于數(shù)據(jù)庫(kù)的模型更改(如果我們有的話),而不需要完全銷毀再重建它。當(dāng)情況偏離時(shí),它也可以讓我們用來 恢復(fù)更改。我們使用移植文件來 移植數(shù)據(jù)庫(kù)的變化(即使還沒有變化),命令如下:
$ python manage.py migrate myapp
South足夠智能,知道去哪里找到移植文件,也記得我們做的最后的移植。你可以指定單獨(dú)的移植文件,但這一般并不是必須的。
當(dāng)我們最終對(duì)模型做出改變時(shí),我們使用下面的命令來讓South創(chuàng)建一個(gè)移植文件:
$ python manage.py schemamigration myapp --auto
這將檢測(cè)myapp中的模型,并自動(dòng)相應(yīng)的添加、刪除或修改數(shù)據(jù)庫(kù)中的表。然后使用如上的移植命令就可以將改變應(yīng)用到數(shù)據(jù)庫(kù)上。
開發(fā)區(qū)域
還有一件事你需要注意:將開發(fā)區(qū)域與你已經(jīng)確認(rèn)的文件區(qū)分開,原因顯而易見。使用Git和Mercurial實(shí)現(xiàn)這個(gè)很簡(jiǎn)單,而且也有助于部署。創(chuàng)建django_project所在目錄之外的一個(gè)目錄作為你開發(fā)區(qū)域(我把它叫做dev)。
在你的開發(fā)目錄,使用git或Mercurial克隆當(dāng)前項(xiàng)目:
$ (git/hg) clone /path/to/my/project/
兩個(gè)工具都將創(chuàng)建庫(kù)的一份完整拷貝。所有的更改、分支及歷史都將在新庫(kù)中可用。從現(xiàn)在起,你應(yīng)該在你的開發(fā)目錄工作。
由于使用Git和Mercurial來進(jìn)行分支都容易便捷,當(dāng)你切換新分支或站點(diǎn)的大規(guī)模變化時(shí)創(chuàng)建分支。下面是兩個(gè)工具的實(shí)現(xiàn)方法:
(git)
$ git checkout -b <branchname>
這不僅創(chuàng)建了一個(gè)命名新分支且會(huì)將代碼檢出。幾乎所有的開發(fā)工作都應(yīng)該在分支上,這樣主分支可以隨時(shí)恢復(fù)。
(Mercurial)
$ hg branch <branchname>
請(qǐng)注意,在Mercurial社區(qū)里分支是一個(gè)有爭(zhēng)議的話題,目前這里有一些可用的選項(xiàng),但其中還沒有“顯然正確”的。在這里,我使用命名分支,這可能是最安全且最有益的分支風(fēng)格。任何在branch命令后的提交將在新分支生效。
使用 Fabric 來進(jìn)行部署
那么我們就有了一個(gè)Django應(yīng)用。我們?cè)趺磥聿渴鹚??Fabric。對(duì)一個(gè)合理大小的項(xiàng)目來說,討論任何其它的東西都是浪費(fèi)時(shí)間。Fabric可用于許多種不同目的,不過在部署方面它確實(shí)很出色。
$ pip install fabric
Fabric 需要一個(gè)名為fabfile.py的 fabfile 文件,這個(gè)文件定義了所有我們可以采用的動(dòng)作?,F(xiàn)在我們就來創(chuàng)建它。將下面這些內(nèi)容寫入fabfile.py并將其放到項(xiàng)目的根目錄。
from fabric.api import localdef prepare_deployment(branch_name): local('python manage.py test django_project') local('git add -p && git commit') # or local('hg add && hg commit')
這樣就會(huì)運(yùn)行這個(gè)測(cè)試并提交你的變更,但是提交只在測(cè)試通過的條件下發(fā)生。在此處,生產(chǎn)環(huán)境中一個(gè)簡(jiǎn)單的"pull"動(dòng)作都可以成為實(shí)際部署。我們給實(shí)際部署再增加一些東西。將以下內(nèi)容增加到fabfile.py:
- Python Web框架之Django框架文件上傳功能詳解
- python設(shè)計(jì)微型小說網(wǎng)站(基于Django+Bootstrap框架)
- Python django框架應(yīng)用中實(shí)現(xiàn)獲取訪問者ip地址示例
- Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例
- Python實(shí)現(xiàn)手寫一個(gè)類似django的web框架示例
- 解析Mac OS下部署Pyhton的Django框架項(xiàng)目的過程
- python框架django項(xiàng)目部署相關(guān)知識(shí)詳解
相關(guān)文章
Python實(shí)現(xiàn)PDF轉(zhuǎn)MP3的示例代碼
我們平常看到很多文件都是PDF格式,網(wǎng)上的各類書籍多為此格式。有時(shí)候不方便閱讀,或者怕費(fèi)眼睛傷頸椎,那么有沒有一種方法可以把它變?yōu)橐纛l,本文就來和大家詳細(xì)講講2023-05-05探秘TensorFlow 和 NumPy 的 Broadcasting 機(jī)制
這篇文章主要介紹了探秘TensorFlow 和 NumPy 的 Broadcasting 機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python?socket如何解析HTTP請(qǐng)求內(nèi)容
這篇文章主要介紹了Python?socket如何解析HTTP請(qǐng)求內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02pycharm運(yùn)行程序時(shí)在Python console窗口中運(yùn)行的方法
今天小編就為大家分享一篇pycharm運(yùn)行程序時(shí)在Python console窗口中運(yùn)行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12python中文件的創(chuàng)建與寫入實(shí)戰(zhàn)代碼
這篇文章主要給大家介紹了關(guān)于python中文件的創(chuàng)建與寫入的相關(guān)資料,在Python中文件寫入提供了不同的模式和方法來滿足不同的需求,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10Django創(chuàng)建一個(gè)后臺(tái)的基本步驟記錄
這篇文章主要給大家介紹了關(guān)于Django創(chuàng)建一個(gè)后臺(tái)的基本步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python中用Decorator來簡(jiǎn)化元編程的教程
這篇文章主要介紹了Python中用Decorator來簡(jiǎn)化元編程的教程,來自于IBM官方開發(fā)者技術(shù)文檔,需要的朋友可以參考下2015-04-04python中的getattribute 、getattr、setattr方法詳解
這篇文章主要介紹了python中的getattribute 、getattr、setattr方法詳解,python類中默認(rèn)有一些特殊方法,這篇文章記錄一下特殊方法的功能及用法,需要的朋友可以參考下2023-11-11簡(jiǎn)述Python2與Python3的不同點(diǎn)
在Python2和Python3中都提供print()方法來打印信息,但兩個(gè)版本間的print稍微有差異。下面通過本文給大家介紹Python2與Python3的不同點(diǎn),需要的朋友參考下2018-01-01