全面剖析Python的Django框架中的項(xiàng)目部署技巧
from fabric.api import lcd, localdef deploy(): with lcd('/path/to/my/prod/area/'): # With git... local('git pull /my/path/to/dev/area/') # With Mercurial... local('hg pull /my/path/to/dev/area/') local('hg update') # With both local('python manage.py migrate myapp') local('python manage.py test myapp') local('/my/command/to/restart/webserver')
這將會(huì)從開(kāi)發(fā)主分支拉回(pull)變更,運(yùn)行你實(shí)施的任何遷移,運(yùn)行測(cè)試,并且重啟你的web服務(wù)器。這些只需在命令行中的一條簡(jiǎn)單的命令。如果其中的一條命令失敗了,腳本將會(huì)停止運(yùn)行并報(bào)告發(fā)生的事情。一旦你修復(fù)了這個(gè)問(wèn)題,無(wú)需再手工運(yùn)行其余步驟。因?yàn)樗鼈兪莾绲鹊?,你只需重新運(yùn)行部署命令,一切都將恢復(fù)正常。
(譯注:idempotent 冪等,某一元運(yùn)算為冪等的時(shí),其作用在任一元素兩次后會(huì)和其作用一次的結(jié)果相同。)
注意上面的代碼是假設(shè)你部署在相同的機(jī)器上。如果不是這樣的話,這個(gè)文件很可能相同,但是會(huì)使用Fabric的run函數(shù)來(lái)替代local。參見(jiàn)Fabric 文檔 獲取更多細(xì)節(jié)。
現(xiàn)在我們創(chuàng)建了fabfile.py,該怎樣實(shí)際部署呢?很簡(jiǎn)單。只需運(yùn)行:
$ fab prepare_deployment$ fab deploy
在技術(shù)層面,這些可以合并為一個(gè)單獨(dú)的命令,但是我覺(jué)得最好明確的準(zhǔn)備你的部署工作再部署它,因?yàn)檫@樣就使你更關(guān)注于你正在做的事情。
建立單元測(cè)試
如果你但凡聽(tīng)說(shuō)過(guò)我,可能就會(huì)知道我對(duì)自動(dòng)測(cè)試非常著迷。無(wú)論如何,有太多的Django項(xiàng)目沒(méi)有寫(xiě)任何測(cè)試。這是需要預(yù)先花費(fèi)一點(diǎn)時(shí)間去做的事情,但是卻給未來(lái)帶來(lái)巨大的紅利。如果你曾經(jīng)使用print語(yǔ)句調(diào)試過(guò)你的應(yīng)用,在恰當(dāng)?shù)牡胤接煤线m的測(cè)試,這樣就將給你節(jié)省許多時(shí)間。
對(duì)于Django,Python的單元測(cè)試模塊完全夠用了。下面是一個(gè)app的一個(gè)最小的測(cè)試?yán)樱?br />
import datetimefrom django.test import TestCasefrom myapp.models import Postclass BlogPostTestCase(TestCase): def setUp(self): Post.objects.create(id=1, title='Starting a Django 1.6 Project the Right Way', date=datetime.datetime.now(), category='Django') Post.objects.create(id=2, title='Python\'s Hardest Problem', date=datetime.datetime.now(), category='Python') def test_posts_have_category(self): """Animals that can speak are correctly identified""" first_post = Post.objects.get(id=1) second_post = Post.objects.get(id=2) self.assertEqual(first_post.category, 'Django') self.assertEqual(second_post.category, 'Python')
你可以將這些代碼寫(xiě)到名為test_<appname>.py的文件中,并將其放到app測(cè)試時(shí)所在的目錄。為了為app運(yùn)行這些測(cè)試,只需運(yùn)行./manage.py test <appname>。我們創(chuàng)建的fabfile文件已經(jīng)知道在部署前運(yùn)行這些測(cè)試,所以不需要再做任何別的修改了。
享受你的新的Django應(yīng)用程序
就是這些!你已經(jīng)開(kāi)始了實(shí)際的開(kāi)發(fā)。現(xiàn)在真正的樂(lè)趣才會(huì)開(kāi)始。只需記?。航?jīng)常提交,測(cè)試一切,還有不要在你提供服務(wù)的地方書(shū)寫(xiě)代碼。無(wú)論從現(xiàn)在起會(huì)發(fā)生什么,你肯定已經(jīng)以正確的方式開(kāi)始了一個(gè)Django1.6 項(xiàng)目!
- Python Web框架之Django框架文件上傳功能詳解
- python設(shè)計(jì)微型小說(shuō)網(wǎng)站(基于Django+Bootstrap框架)
- Python django框架應(yīng)用中實(shí)現(xiàn)獲取訪問(wèn)者ip地址示例
- Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例
- Python實(shí)現(xiàn)手寫(xiě)一個(gè)類(lèi)似django的web框架示例
- 解析Mac OS下部署Pyhton的Django框架項(xiàng)目的過(guò)程
- python框架django項(xiàng)目部署相關(guān)知識(shí)詳解
相關(guān)文章
Python實(shí)現(xiàn)PDF轉(zhuǎn)MP3的示例代碼
我們平??吹胶芏辔募际荘DF格式,網(wǎng)上的各類(lèi)書(shū)籍多為此格式。有時(shí)候不方便閱讀,或者怕費(fèi)眼睛傷頸椎,那么有沒(méi)有一種方法可以把它變?yōu)橐纛l,本文就來(lái)和大家詳細(xì)講講2023-05-05探秘TensorFlow 和 NumPy 的 Broadcasting 機(jī)制
這篇文章主要介紹了探秘TensorFlow 和 NumPy 的 Broadcasting 機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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ì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python中文件的創(chuàng)建與寫(xiě)入實(shí)戰(zhàn)代碼
這篇文章主要給大家介紹了關(guān)于python中文件的創(chuàng)建與寫(xiě)入的相關(guān)資料,在Python中文件寫(xiě)入提供了不同的模式和方法來(lái)滿足不同的需求,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10Django創(chuàng)建一個(gè)后臺(tái)的基本步驟記錄
這篇文章主要給大家介紹了關(guān)于Django創(chuàng)建一個(gè)后臺(tái)的基本步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python中用Decorator來(lái)簡(jiǎn)化元編程的教程
這篇文章主要介紹了Python中用Decorator來(lái)簡(jiǎn)化元編程的教程,來(lái)自于IBM官方開(kāi)發(fā)者技術(shù)文檔,需要的朋友可以參考下2015-04-04python中的getattribute 、getattr、setattr方法詳解
這篇文章主要介紹了python中的getattribute 、getattr、setattr方法詳解,python類(lèi)中默認(rèn)有一些特殊方法,這篇文章記錄一下特殊方法的功能及用法,需要的朋友可以參考下2023-11-11簡(jiǎn)述Python2與Python3的不同點(diǎn)
在Python2和Python3中都提供print()方法來(lái)打印信息,但兩個(gè)版本間的print稍微有差異。下面通過(guò)本文給大家介紹Python2與Python3的不同點(diǎn),需要的朋友參考下2018-01-01