對(duì)于Python的Django框架部署的一些建議
來源:易賢網(wǎng) 閱讀:1104 次 日期:2015-04-14 16:20:43
溫馨提示:易賢網(wǎng)小編為您整理了“對(duì)于Python的Django框架部署的一些建議”,方便廣大網(wǎng)友查閱!

Django應(yīng)用、配置文件以及其他各種相關(guān)目錄的最佳布局是什么樣的?”

總是有朋友問我們這個(gè)問題,因此我想花一點(diǎn)時(shí)間,寫一下我們究竟是如何看待這個(gè)問題的,這樣我們就可以很容易讓其他人參照這個(gè)文檔。請(qǐng)注意,這里是基于 Django 1.7.1 版寫的,但是可以很容易應(yīng)用在 Django 1.4 版之后任何版本。

雖然 Django 1.4 發(fā)布時(shí),它包含了一個(gè)改進(jìn)后的項(xiàng)目布局(這還用了很長一段時(shí)間),但本文有一些優(yōu)化項(xiàng)目布局的更好建議。

為什么這種布局比較好

我們?cè)谶@里推薦的項(xiàng)目布局有幾個(gè)優(yōu)點(diǎn),即:

讓你獲得、重新打包并復(fù)用單個(gè)的Django應(yīng)用來用于其他的項(xiàng)目。這通常是不明確的,正如你正在構(gòu)建一個(gè)不管是否要復(fù)用的應(yīng)用。在一開始以想要復(fù)用的方式構(gòu)建應(yīng)用,會(huì)讓這一切變得更加簡(jiǎn)單。

鼓勵(lì)設(shè)計(jì)可復(fù)用的應(yīng)用。

環(huán)境的詳細(xì)設(shè)置。在一個(gè)單一的整體配置文件中,if DEBUG==True 沒有什么意義。這使得很容易能看到哪些配置是共享的,哪些是在每個(gè)環(huán)境的基礎(chǔ)上可覆寫的。

環(huán)境的具體安裝要求(PIP requirements)。

如果有必要,項(xiàng)目級(jí)的模板和靜態(tài)文件可以覆寫應(yīng)用級(jí)的默認(rèn)值。

小而更具體的測(cè)試文件更易于閱讀和理解。

假設(shè)你有兩個(gè)應(yīng)用 blog 和 users,以及兩個(gè)開發(fā)環(huán)境 dev 和 prod。你的項(xiàng)目布局結(jié)構(gòu)應(yīng)該是這樣的:

代碼如下:

myproject/

manage.py

myproject/

__init__.py

urls.py

wsgi.py

settings/

__init__.py

base.py

dev.py

prod.py

blog/

__init__.py

models.py

managers.py

views.py

urls.py

templates/

blog/

base.html

list.html

detail.html

static/

tests/

__init__.py

test_models.py

test_managers.py

test_views.py

users/

__init__.py

models.py

views.py

urls.py

templates/

users/

base.html

list.html

detail.html

static/

tests/

__init__.py

test_models.py

test_views.py

static/

css/

js/

templates/

base.html

index.html

requirements/

base.txt

dev.txt

test.txt

prod.txt

本文的剩余部分介紹了如何將項(xiàng)目遷移到這個(gè)布局,以及為什么這種布局比較好。

當(dāng)前默認(rèn)布局

我們將調(diào)用示例項(xiàng)目foo,我知道這是一個(gè)非常有創(chuàng)意的名字。我們假設(shè)在這里,我們將要啟動(dòng)foo.com。但當(dāng)我們希望將我們的項(xiàng)目名稱映射最終域名時(shí),該項(xiàng)目將以不以任何意義要求的方式存在在這里。

如果你使用 django-admin.py startproject foo 命令開啟這個(gè)項(xiàng)目,你會(huì)得到一個(gè)像這樣的目錄結(jié)構(gòu):

?1234567 foo/ manage.py foo/ __init__.py settings.py urls.py wsgi.py

這種布局是一個(gè)好起點(diǎn),我們有一個(gè)頂級(jí)目錄foo,里面包含了manage.py文件和項(xiàng)目目錄foo/foo/。在這個(gè)目錄,你可以查詢到源代碼控制系統(tǒng)(比如 Git) 。

你應(yīng)該想到子目錄foo/foo/就是這個(gè)項(xiàng)目。這里的所有文件,不是一個(gè)Django應(yīng)用程序,就是與項(xiàng)目相關(guān)的配套文件。

修改配置

這里的任務(wù)是修正不好的配置文件。我將這個(gè)布局向新用戶展示,我往往驚訝于這幾個(gè)人怎么知道這甚至可能做到。事實(shí)上,當(dāng)大家都知道這些配置只是Python代碼時(shí),他們也不將它們當(dāng)做Python代碼。

因此,讓我們來改進(jìn)配置。對(duì)于oo項(xiàng)目而言,將有4個(gè)開發(fā)環(huán)境:dev、stage、jenkins 和 production。給每個(gè)開發(fā)環(huán)境一個(gè)它們自己的配置文件。這個(gè)過程中要做的事情是:

在foo/foo/目錄下新建一個(gè)配置目錄,并在里面創(chuàng)建一個(gè)空的__init __.py文件。

將foo/foo/settings.py移動(dòng)并重命名為foo/foo/settings/base.py。

在foo/foo/settings/目錄下創(chuàng)建單獨(dú)的dev.py、stage.py、jenkins.py 和 production.py文件。這四種環(huán)境的特定配置文件應(yīng)該包含如下內(nèi)容:

?1 from base import *

為什么這很重要呢?對(duì)于本地開發(fā)你想要設(shè)置DEBUG=True,但很容易不小心將這個(gè)推到生產(chǎn)代碼中,因此需要打開 foo/foo/settings/production.py 文件,在初始導(dǎo)入base后加上DEBUG=False。現(xiàn)在,對(duì)于這種愚蠢的錯(cuò)誤,你的生產(chǎn)環(huán)境是安全的。

還有什么可以定制?很明顯你可以針對(duì)不同的數(shù)據(jù)庫,甚至是不同的主機(jī)來配置staging、jenkins和production等開發(fā)環(huán)境。然后在每個(gè)環(huán)境配置文件中來調(diào)整那些配置。

使用這些配置

無論你通常使用哪種方法,使用這些配置都非常簡(jiǎn)單。要使用該操作系統(tǒng)的環(huán)境,你只要做:

?1 export DJANGO_SETTINGS_MODULE=“foo.settings.jenkins”

現(xiàn)在你就在使用 jenkins 的配置。

或者,也許你更喜歡把它們作為這樣的命令行選項(xiàng):

?1 ./manage.py migrate —settings=foo.settings.production

同樣的,如果你使用 gunicorn,命令則如下:

?1 gunicorn -w 4 -b 127.0.0.1:8001 —settings=foo.settings.dev

還有什么可自定義的配置?

另一個(gè)實(shí)用建議是將一些默認(rèn)的集合配置從元組改為列表。例如 INSTALLED_APPS,將它從:

?123 INSTALLED_APPS =( ... )

改為:

?123 INSTALLED_APPS = [ … ]

現(xiàn)在,基于每個(gè)環(huán)境的特定配置文件,我們可以更輕松地在 foo/settings/base.py文件中添加和刪除應(yīng)用。例如,你可能只想在dev環(huán)境而不是其他環(huán)境中安裝Django調(diào)試工具欄。

這個(gè)技巧對(duì) TEMPLATE_DIRS和MIDDLEWARE_CLASSES 配置也非常有用。

我們經(jīng)常使用的另一個(gè)技巧是把應(yīng)用分為兩個(gè)列表,一個(gè)是項(xiàng)目的必要前提,另一個(gè)用于實(shí)際項(xiàng)目應(yīng)用。如下面所示:

?12345678910111213141516 PREREQ_APPS = [ ‘django.contrib.auth', ‘django.contrib.contenttypes', … ‘debug_toolbar', ‘imagekit', ‘haystack', ] PROJECT_APPS = [ ‘homepage', ‘users', ‘blog', ] INSTALLED_APPS = PREREQ_APPS + PROJECT_APPS

為什么這個(gè)有用?第一,它有助于更好地區(qū)分Django核心應(yīng)用、第三方應(yīng)用及你自己的內(nèi)部項(xiàng)目的具體應(yīng)用。對(duì)于測(cè)試和代碼覆蓋率等事情,寫明你的特定應(yīng)用的PROJECT_APPS列表往往就派上了用場(chǎng)。你有寫一個(gè)應(yīng)用列表,因此你可以輕松自動(dòng)地確保它們的測(cè)試運(yùn)行,記錄的測(cè)試覆蓋率只包括它們而不包括任何第三方的應(yīng)用,且無需在兩個(gè)不同的地方維護(hù)這個(gè)列表。

修改要求

大多是項(xiàng)目有一個(gè)requirements.txt文件,它用如下命令安裝:

?1 pip install -r requirements.txt

對(duì)于簡(jiǎn)單的小項(xiàng)目這以足夠了,但requirements.txt文件有一個(gè)鮮為人知的特點(diǎn)是,你可以使用-r參數(shù)來包括其他文件。因此,對(duì)于所有常見的安裝要求,我們可以創(chuàng)建一個(gè)base.txt文件;然后,如果我們需要能夠運(yùn)行測(cè)試,我們可以創(chuàng)建一個(gè)包含如下內(nèi)容的特定的requirements/test.txt文件:

復(fù)制代碼 代碼如下:-r base.txt

pytest==2.5.2

coverage==3.7.1

我承認(rèn)這沒有巨大的好處,但它確實(shí)有助于區(qū)分什么是每個(gè)開發(fā)環(huán)境的要求。同時(shí),對(duì)于其性能,它不會(huì)安裝一堆在實(shí)際生產(chǎn)中用不上的東西,來減少生產(chǎn)環(huán)境中的pip安裝時(shí)間。

測(cè)試文件

我們?yōu)槭裁匆鸱趾艽蟮臏y(cè)試文件呢?其中的一個(gè)主要原因是,如果你在一個(gè)tests.py文件中對(duì)每個(gè)應(yīng)用寫了足夠多的測(cè)試,那么這個(gè)文件最終將變得非常臃腫。這樣的代碼可讀性很差,并且你不得不在編輯器中花很多時(shí)間來滾動(dòng)瀏覽代碼。

當(dāng)你和其他開發(fā)者一起工作時(shí),小文件也能讓你在代碼合并時(shí)少遇到?jīng)_突。小文件是你的朋友。

URLs

對(duì)于小型項(xiàng)目,把所有的URL定義放在foo/urls.py文件中,讓它們?cè)谕粋€(gè)地方。但是,如果你的目標(biāo)是代碼的清晰和可復(fù)用,你最好在每個(gè)應(yīng)用中定義它們的url,再將它們包含在你的主項(xiàng)目中。你不應(yīng)如下所做:

?12345678 urlpatterns = patterns(‘', url(r'^$', HomePageView.as_view(), name=‘home'), url(r'^blog/$', BlogList.as_view(), name=‘blog_list'), url(r'^blog/(?P<pk>d+)/$', BlogDetail.as_view(), name=‘blog_detail'), … url(r'^user/list/$', UserList.as_view(), name=‘user_list'), url(r'^user/(?P<username>w+)/$', UserDetail.as_view(), name=‘user_detail'), )

你應(yīng)該這樣做:

?12345 urlpatterns = patterns(‘', url(r'^$', HomePageView.as_view(), name=‘home'), url(r'^blog/‘, include(‘blog.urls')), url(r'^user/‘, include(‘user.urls')), )

模板和靜態(tài)資源

每個(gè)應(yīng)用中都有templates/和static/目錄,這讓一個(gè)應(yīng)用可以基本上復(fù)用到其他的項(xiàng)目中。

對(duì)于一個(gè)很酷的功能,我們?nèi)谝粋€(gè)包中獲得應(yīng)用提供的默認(rèn)模板和任何相關(guān)的靜態(tài)資源,如特殊的Javascript。

但是,它也讓我們可以覆寫每個(gè)項(xiàng)目主目錄foo/templates/下的模板。我們通過增加一個(gè) templates/blog/detail.html 模板覆寫默認(rèn)的 blog/templates/blog/detail.html 模板。

復(fù)用Django應(yīng)用

假設(shè)你已經(jīng)使用這個(gè)布局一段時(shí)間,有一天你會(huì)意識(shí)到你的新項(xiàng)目需要一個(gè)blog應(yīng)用,這個(gè)從你的foo項(xiàng)目出來的應(yīng)用將是完美的。所以你復(fù)制、粘貼文件……錯(cuò)誤!現(xiàn)在你有這個(gè)應(yīng)用的兩個(gè)副本。假定你還記得,在一個(gè)副本中進(jìn)行Bug修復(fù)和新功能增添需要手動(dòng)地在項(xiàng)目間遷移。

相反,為你的博客創(chuàng)建一個(gè)新的目錄,并把foo/blog/目錄中的內(nèi)容放入其中。同時(shí),調(diào)整現(xiàn)有的foo項(xiàng)目和你的新項(xiàng)目來進(jìn)行安裝。

如果需要的話,它們?nèi)匀豢梢愿欉@兩個(gè)不同版本的應(yīng)用,或持續(xù)更新,且獲得它們不斷發(fā)展中的所有bug修復(fù)和新功能。你仍然可以在每個(gè)項(xiàng)目的基礎(chǔ)上,根據(jù)需求覆寫模板和靜態(tài)資源,所以這樣做真的沒有任何問題。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:對(duì)于Python的Django框架部署的一些建議
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)