




已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十二章: 部署Django 51本章包含創(chuàng)建一個(gè)django程序最必不可少的步驟 在服務(wù)器上部署它 1如果你一直跟著我們的例子做,你可能正在用runserver 但是runserver 要部署你的django程序,你需要掛接到工業(yè)用的服務(wù)器 如:Apache 在本章,我們將展示如何做,但是,在做之前我們要給你一個(gè)(要做的事的)清單. 5準(zhǔn)備你的代碼庫(kù) 很幸運(yùn),runserver 但是,在開(kāi)始前,有一些* 1關(guān)閉Debug模式. 我們?cè)诘?章,用命令 django-admin.py startproject創(chuàng)建了一個(gè)項(xiàng)目 , 其中創(chuàng)建的 settings.py 文件的 DEBUG 設(shè)置默認(rèn)為 True . django會(huì)根據(jù)這個(gè)設(shè)置來(lái)改變他們的行為, 如果 DEBUG 模式被開(kāi)啟. 例如, 如果 DEBUG 被設(shè)置成 True , 那么: 所有的數(shù)據(jù)庫(kù)查詢(xún)將被保存在內(nèi)存中, 以 django.db.connection.queries 的形式. 你可以想象,這個(gè)吃?xún)?nèi)存! 任何404錯(cuò)誤都將呈現(xiàn)django的特殊的404頁(yè)面(第3章有)而不是普通的404頁(yè)面。 這個(gè)頁(yè)面包含潛在的敏感信息,但是不會(huì)暴露在公共互聯(lián)網(wǎng)。 2 你的應(yīng)用中任何未捕獲的異常,從基本的python語(yǔ)法錯(cuò)誤到數(shù)據(jù)庫(kù)錯(cuò)誤以及模板語(yǔ)法錯(cuò)誤都會(huì)返回漂亮的Django錯(cuò)誤頁(yè)面。 這個(gè)頁(yè)面包含了比404錯(cuò)誤頁(yè)面更多的敏感信息,所以這個(gè)頁(yè)面絕對(duì)不要公開(kāi)暴露。 簡(jiǎn)單的說(shuō),把 DEBUG 設(shè)置成 True 相當(dāng)于告訴Django你的網(wǎng)站只會(huì)被可信任的開(kāi)發(fā)人員使用。 Internet里充滿(mǎn)了不可信賴(lài)的事物,當(dāng)你準(zhǔn)備部署你的應(yīng)用時(shí),首要的事情就是把 DEBUG 設(shè)置為 False 。 來(lái)關(guān)閉模板Debug模式。 1類(lèi)似地,你應(yīng)該在生產(chǎn)環(huán)境中把TEMPLATE_DEBUGFalse 如果這個(gè)設(shè)為 True ,為了在那個(gè)好看的錯(cuò)誤頁(yè)面上顯示足夠的東西,Django的模版系統(tǒng)就會(huì)為每一個(gè)模版保存一些額外的信息。 2實(shí)現(xiàn)一個(gè)404模板 1如果 DEBUG 設(shè)置為 True ,Django會(huì)顯示那個(gè)自帶的404錯(cuò)誤頁(yè)面。 但如果 DEBUG 被設(shè)置成 False ,那它的行為就不一樣了: 他會(huì)顯示一個(gè)在你的模版根目錄中名字叫 404.html 的模版 所以,當(dāng)你準(zhǔn)備部署你的應(yīng)用時(shí),你會(huì)需要?jiǎng)?chuàng)建這個(gè)模版并在里面放一些有意義的“頁(yè)面未找到”的信息 這里有一個(gè) 404.html的示例,你可以從它開(kāi)始。 假定你使用的模板繼承并定義一個(gè) base.html,該頁(yè)面由titlecontent兩塊組成。 % extends base.html % block title %Page not found% endblock % block content %Page not foundSorry, but the requested page could not be found.% endblock %要測(cè)試你的404.html頁(yè)面是否正常工作,僅僅需要將DEBUG 設(shè)置為 False ,并且訪(fǎng)問(wèn)一個(gè)并不存在的URL。 (它將在 sunserver 上工作的和開(kāi)發(fā)服務(wù)器上一樣好) 2實(shí)現(xiàn)一個(gè)500模板 類(lèi)似的,如果 DEBUG 設(shè)置為 False ,Djang不再會(huì)顯示它自帶的應(yīng)對(duì)未處理的Python異常的錯(cuò)誤反饋?lái)?yè)面。 作為代替,它會(huì)查找一個(gè)名為 500.html 的模板并且顯示它。 像 404.html 一樣,這個(gè)模板應(yīng)該被放置在你的模板根目錄下。 這里有一個(gè)關(guān)于500.html的比較棘手的問(wèn)題。你永遠(yuǎn)不能確定 為什么會(huì)顯示這個(gè)模板,所以它不應(yīng)該做任何需要連接數(shù)據(jù)庫(kù),或者依賴(lài)任何可能被破壞的基礎(chǔ)構(gòu)件的事情。 (例如:它不應(yīng)該使用自定義模板標(biāo)簽。)如果它用到了模板繼承,那么父模板也就不應(yīng)該依賴(lài)可能被破壞的基礎(chǔ)構(gòu)件。因此,最好的方法就是避免模板繼承,并且用一些非常簡(jiǎn)單的東西。 這是一個(gè) 500.html 的例子,可以把它作為一個(gè)起點(diǎn): Page unavailable Page unavailable Sorry, but the requested page is unavailable due to a server hiccup. Our engineers have been notified, so check back later.設(shè)置錯(cuò)誤警告 當(dāng)你使用Django制作的網(wǎng)站運(yùn)行中出現(xiàn)了異常,你會(huì)希望去了解以便于修正它。 默認(rèn)情況下,Django在你的代碼引發(fā)未處理的異常時(shí),將會(huì)發(fā)送一封Email至開(kāi)發(fā)者團(tuán)隊(duì)。但你需要去做兩件事來(lái)設(shè)置這種行為。 首先,改變你的ADMINS設(shè)置用來(lái)引入你的E-mail地址,以及那些任何需要被注意的聯(lián)系人的E-mail地址。 這個(gè)設(shè)置采用了類(lèi)似于(姓名, Email)元組,像這樣: ADMINS = ( (John Lennon, ), (Paul McCartney, ),)第二,確保你的服務(wù)器配置為發(fā)送電子郵件。 設(shè)置好postfix,sendmail或其他本書(shū)范圍之外但是與Django設(shè)置相關(guān)的郵件服務(wù)器,你需要將將 EMAIL_HOST設(shè)置為你的郵件服務(wù)器的正確的主機(jī)名. 默認(rèn)模式下是設(shè)置為localhost, 這個(gè)設(shè)置對(duì)大多數(shù)的共享主機(jī)系統(tǒng)環(huán)境適用. 取決于你的安排的復(fù)雜性,你可能還需要設(shè)置 EMAIL_HOST_USER,EMAIL_HOST_PASSWORD,EMAIL_PORT或EMAIL_USE_TLS。 1你還可以設(shè)置EMAIL_SUBJECT_PREFIX以控制Django使用的 error e-mail的前綴。 默認(rèn)情況下它被設(shè)置為Django 設(shè)置連接中斷警報(bào) 如果你安裝有CommonMiddleware(比如,你的MIDDLEWARE_CLASSES設(shè)置包含了mon.CommonMiddleware的情況下,默認(rèn)就安裝了CommonMiddleware),你就具有了設(shè)置這個(gè)選項(xiàng)的能力:有人在訪(fǎng)問(wèn)你的Django網(wǎng)站的一個(gè)非空的鏈接而導(dǎo)致一個(gè)404錯(cuò)誤的發(fā)生和連接中斷的情況,你將收到一封郵件. 如果你想激活這個(gè)特性,設(shè)置SEND_BROKEN_LINK_EMAILS 為T(mén)rue(默認(rèn)為False),并設(shè)置你的MANAGERS為某個(gè)人或某些人的郵件地址,這些郵件地址將會(huì)收到報(bào)告連接中斷錯(cuò)誤的郵件. MANAGERS使用和ADMINS 同樣的語(yǔ)法.例如: MANAGERS = ( (George Harrison, ), (Ringo Starr, ),)請(qǐng)注意,錯(cuò)誤的Email會(huì)令人感到反感,對(duì)于任何人來(lái)說(shuō)都是這樣。 使用針對(duì)產(chǎn)品的不同的設(shè)置 在此書(shū)中,我們僅僅處理一個(gè)單一的設(shè)置文件 settings.py文件由django-admin.py startproject命令生成。但是當(dāng)你準(zhǔn)備要進(jìn)行配置的時(shí)候,你將發(fā)現(xiàn)你需要多個(gè)配置文件以使你的開(kāi)發(fā)環(huán)境和產(chǎn)品環(huán)境相獨(dú)立。 比如,你可能不想每次在本地機(jī)器上測(cè)試代碼改變的時(shí)候?qū)EBUG從False 改為T(mén)rue。Django通過(guò)使用多個(gè)配置文件而使得這種情況很容易得到避免。 如果你想把你的配置文件按照產(chǎn)品設(shè)置和開(kāi)發(fā)設(shè)置組織起來(lái),你可以通過(guò)下面三種方法的其中一種達(dá)到這個(gè)目的。 設(shè)置成兩個(gè)全面的,彼此獨(dú)立的配置文件 設(shè)置一個(gè)基本的配置文件(比如,為了開(kāi)發(fā))和第二個(gè)(為了產(chǎn)品)配置文件,第二個(gè)配置文件僅僅從基本的那個(gè)配置文件導(dǎo)入配置,并對(duì)需要定義的進(jìn)行復(fù)寫(xiě). 使用一個(gè)單獨(dú)的配置文件,此配置文件包含一個(gè)Python的邏輯判斷根據(jù)上下文環(huán)境改變?cè)O(shè)置。 我們將會(huì)在依次解釋這幾種方式 首先,最基本的方法是定義兩個(gè)單獨(dú)的配置文件。 如果你是跟隨之前的例子做下來(lái)的,那么你已經(jīng)有了一個(gè)settings.py了,現(xiàn)在你只需要將它復(fù)制一份并命名為settings_production.py(文件名可以按照你自己的喜好定義),在這個(gè)新文件中改變DEBUG等設(shè)置。 第二種方法比較類(lèi)似,但是減少了許多冗余。 作為使用兩個(gè)內(nèi)容大部分相同的配置文件的替代方式,你可以使用一個(gè)文件為基本文件,另外一個(gè)文件從基本文件中導(dǎo)入相關(guān)設(shè)定。 例如 # settings.pyDEBUG = TrueTEMPLATE_DEBUG = DEBUGDATABASE_ENGINE = postgresql_psycopg2DATABASE_NAME = devdbDATABASE_USER = DATABASE_PASSWORD = DATABASE_PORT = # .# settings_production.pyfrom settings import *DEBUG = TEMPLATE_DEBUG = FalseDATABASE_NAME = productionDATABASE_USER = appDATABASE_PASSWORD = letmein此處,settings_production.py 從settings.py 導(dǎo)入所有的設(shè)定,僅僅只是重新定義了產(chǎn)品模式下需要特殊處理的設(shè)置。 在這個(gè)案例中,DEBUG 被設(shè)置為False,但是我們已經(jīng)對(duì)產(chǎn)品模式設(shè)置了不同的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)參數(shù)。 (后者將向你演示你可以重新定義 任何 設(shè)置,并不只是象 DEBUG 這樣的基本設(shè)置。) 最終,最精簡(jiǎn)的達(dá)到兩個(gè)配置環(huán)境設(shè)定的方案是使用一個(gè)配置文件,在此配置文件中根據(jù)不同的環(huán)境進(jìn)行設(shè)置。 一個(gè)達(dá)到這個(gè)目的的方法是檢查當(dāng)前的主機(jī)名。 例如: # settings.pyimport socketif socket.gethostname() = my-laptop: DEBUG = TEMPLATE_DEBUG = Trueelse: DEBUG = TEMPLATE_DEBUG = False# .在這里,我們從python標(biāo)準(zhǔn)庫(kù)導(dǎo)入了socket 模塊,使用它來(lái)檢查當(dāng)前系統(tǒng)的主機(jī)名。 我們可以通過(guò)檢查主機(jī)名來(lái)確認(rèn)代碼是否運(yùn)行在產(chǎn)品服務(wù)器上。 一個(gè)關(guān)鍵是配置文件僅僅是包含python代碼的文件。你可以從其他文件導(dǎo)入這些python代碼,可以通過(guò)這些代碼執(zhí)行任意的邏輯判斷等操作。 如果你打算按照這種方案走下去,請(qǐng)確定這些配置文件中的代碼是足夠安全(防彈)的。 如果這個(gè)配置文件拋出任何的異常,Django都有可能會(huì)發(fā)生很?chē)?yán)重的崩潰。 重命名settings.py 隨便將你的settings.py重命名為settings_dev.py或settings/dev.py或foobar.py,Django 并不在乎你的配置文件取什么名字,只要你告訴它你使用的哪個(gè)配置文件就可以了。 但是如果你真的重命名了由django-admin.py startproject 命令創(chuàng)建的settings.py文件,你會(huì)發(fā)現(xiàn)manage.py會(huì)給出一個(gè)錯(cuò)誤信息說(shuō)找不到配置文件。 那是由于它嘗試從這個(gè)文件中導(dǎo)入一個(gè)叫做settings的模塊,你可以通過(guò)修改manage.py 文件,將 import settings 語(yǔ)句改為導(dǎo)入你自己的模塊,或者使用django-admin.py而不是使用manage.py,在后一種方式中你需要設(shè)置 DJANGO_SETTINGS_MODULE 環(huán)境變量為你的配置文件所在的python 路徑.(比如mysite.settings)。 DJANGO_SETTINGS_MODULE 通過(guò)這種方式的代碼改變后,本章的下一部分將集中在對(duì)具體環(huán)境(比如Apache)的發(fā)布所需要的指令上。 這些指令針對(duì)每一種環(huán)境都不同,但是有一件事情是相同的。 在每一種環(huán)境中,你都需要告訴Web服務(wù)器你的DJANGO_SETTINGS_MODULE是什么,這是你的Django應(yīng)用程序的進(jìn)入點(diǎn)。 DJANGO_SETTINGS_MODULE指向你的配置文件,在你的配置文件中指向你的ROOT_URLCONF,在ROOT_URLCONF中指向了你的視圖以及其他的部分。 DJANGO_SETTINGS_MODULE是你的配置文件的python的路徑 比如,假設(shè)mysite是在你的Python路徑中,DJANGO_SETTINGS_MODULE對(duì)于我們正在進(jìn)行的例子就是mysite.settings。 用Apache和mod_python來(lái)部署Django 目前,Apache和mod_python是在生產(chǎn)服務(wù)器上部署Django的最健壯搭配。 2mod_python (/r/mod_python/)是一個(gè)在Apache中嵌入Python的Apache插件,它在服務(wù)器啟動(dòng)時(shí)將Python代碼加載到內(nèi)存中。 (譯注: 3Django 需要Apaceh 2.x 和mod_python 3.x支持。 備注 如何配置Apache超出了本書(shū)的范圍,因此下面將只簡(jiǎn)單介紹必要的細(xì)節(jié)。 幸運(yùn)的是,如果需要進(jìn)一步學(xué)習(xí)Apache的相關(guān)知識(shí),可以找到相當(dāng)多的絕佳資源。 我們喜歡去的幾個(gè)地方: 開(kāi)源的Apache在線(xiàn)文檔,位于 /r/apache/docs/ Pro Apache,第三版 (Apress, 2004),作者Peter Wainwright, 位于 /r/books/pro-apache/ Apache: The Definitive Guide, 第三版 (OReilly, 2002),作者Ben Laurie和Peter Laurie, 位于 /r/books/apache-pra/ 基本配置 為了配置基于 mod_python 的 Django,首先要安裝有可用的 mod_python 模塊的 Apache。 這通常意味著應(yīng)該有一個(gè) LoadModule 指令在 Apache 配置文件中。 它看起來(lái)就像是這樣: LoadModule python_module /usr/lib/apache2/modules/mod_python.soThen, edit your Apache configuration file and add a directive that ties a specific URL path to a specific Django installation. 例如: 1 SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonDebug Off要確保把 DJANGO_SETTINGS_MODULE 中的 mysite.settings 項(xiàng)目換成與你的站點(diǎn)相應(yīng)的內(nèi)容。 它告訴 Apache,任何在 / 這個(gè)路徑之后的 URL 都使用 Django 的 mod_python 來(lái)處理。 它 將 DJANGO_SETTINGS_MODULE 的值傳遞過(guò)去,使得 mod_python 知道這時(shí)應(yīng)該使用哪個(gè)配置。 注意這里使用 指令而不是 。后者用于指向你的文件系統(tǒng)中的一個(gè)位置,然而 1System Message: WARNING/2 (, line 403); backlinkInline literal start-string without end-string. System Message: WARNING/2 (, line 403); backlinkInline literal start-string without end-string. System Message: WARNING/2 (, line 403); backlinkInline literal start-string without end-string. System Message: WARNING/2 (, line 403); backlinkInline literal start-string without end-string. System Message: ERROR/3 (, line 405)Unexpected indentation. 指向一個(gè) Web 站點(diǎn)的 URL 位置。 System Message: WARNING/2 (, line 405); backlinkInline literal start-string without end-string. System Message: WARNING/2 (, line 405); backlinkInline literal start-string without end-string. Apache 可能不但會(huì)運(yùn)行在你正常登錄的環(huán)境中,也會(huì)運(yùn)行在其它不同的用戶(hù)環(huán)境中;也可能會(huì)有不同的文件路徑或 sys.path。 你需要告訴 mod_python 如何去尋找你的項(xiàng)目及 Django 的位置。 PythonPath /path/to/project, /path/to/django + sys.path你也可以加入一些其它指令,比如 PythonAutoReload Off 以提升性能。 查看 mod_python 文檔獲得詳細(xì)的指令列表。 注意,你應(yīng)該在成品服務(wù)器上設(shè)置 PythonDebug Off 。如果你使用 PythonDebug On 的話(huà),在程序產(chǎn)生錯(cuò)誤時(shí),你的用戶(hù)會(huì)看到難看的(并且是暴露的) Python 回溯信息。 如果你把 PythonDebug 置 On,當(dāng)mod_python出現(xiàn)某些錯(cuò)誤,你的用戶(hù)會(huì)看到丑陋的(也會(huì)暴露某些信息)Python的對(duì)錯(cuò)誤的追蹤的信息。 重啟 Apache 之后所有對(duì)你的站點(diǎn)的請(qǐng)求(或者是當(dāng)你用了 指令后則是虛擬主機(jī))都會(huì)由 Djanog 來(lái)處理。 在同一個(gè) Apache 的實(shí)例中運(yùn)行多個(gè) Django 程序 在同一個(gè) Apache 實(shí)例中運(yùn)行多個(gè) Django 程序是完全可能的。 當(dāng)你是一個(gè)獨(dú)立的 Web 開(kāi)發(fā)人員并有多個(gè)不同的客戶(hù)時(shí),你可能會(huì)想這么做。 只要像下面這樣使用 VirtualHost 你可以實(shí)現(xiàn): NameVirtualHost * ServerName # . SetEnv DJANGO_SETTINGS_MODULE mysite.settings ServerName # . SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings如果你需要在同一個(gè) VirtualHost 中運(yùn)行兩個(gè) Django 程序,你需要特別留意一下以 確保 mod_python 的代碼緩存不被弄得亂七八糟。 使用 PythonInterpreter 指令來(lái)將不 同的 指令分別解釋?zhuān)?ServerName # . SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonInterpreter mysite SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings PythonInterpreter mysite_other 這個(gè) PythonInterpreter 中的值不重要,只要它們?cè)趦蓚€(gè) Location 塊中不同。 用 mod_python 運(yùn)行一個(gè)開(kāi)發(fā)服務(wù)器 因?yàn)?mod_python 緩存預(yù)載入了 Python 的代碼,當(dāng)在 mod_python 上發(fā)布 Django 站點(diǎn)時(shí),你每 改動(dòng)了一次代碼都要需要重啟 Apache 一次。 這還真是件麻煩事,所以這有個(gè)辦法來(lái)避免它: 只要 加入 MaxRequestsPerChild 1 到配置文件中強(qiáng)制 Apache 在每個(gè)請(qǐng)求時(shí)都重新載入所有的 代碼。 但是不要在產(chǎn)品服務(wù)器上使用這個(gè)指令,這會(huì)撤銷(xiāo) Django 的特權(quán)。 如果你是一個(gè)用分散的 print 語(yǔ)句(我們就是這樣)來(lái)調(diào)試的程序員,注意這 print 語(yǔ) 句在 mod_python 中是無(wú)效的;它不會(huì)像你希望的那樣產(chǎn)生一個(gè) Apache 日志。 如果你需要在 mod_python 中打印調(diào)試信息,可能需要用到 Python 標(biāo)準(zhǔn)日志包(Pythons standard logging package)。 更多的信息請(qǐng)參見(jiàn) /lib/module-logging.html 。另一個(gè)選擇是在模板頁(yè)面中加入調(diào)試信息。 使用相同的Apache實(shí)例來(lái)服務(wù)Django和Media文件 Django本身不用來(lái)服務(wù)media文件;應(yīng)該把這項(xiàng)工作留給你選擇的網(wǎng)絡(luò)服務(wù)器。 我們推薦使用一個(gè)單獨(dú)的網(wǎng)絡(luò)服務(wù)器(即沒(méi)有運(yùn)行Django的一個(gè))來(lái)服務(wù)media。 想了解更多信息,看下面的章節(jié)。 不過(guò),如果你沒(méi)有其他選擇,所以只能在同Django一樣的Apache VirtualHost 上服務(wù)media文件,這里你可以針對(duì)這個(gè)站點(diǎn)的特定部分關(guān)閉mod_python: SetHandler None將 Location 改成你的media文件所處的根目錄。 你也可以使用 來(lái)匹配正則表達(dá)式。 比如,下面的寫(xiě)法將Django定義到網(wǎng)站的根目錄,并且顯式地將 media 子目錄以及任何以 .jpg , .gif , 或者 .png 結(jié)尾的URL屏蔽掉: SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings SetHandler None SetHandler None在所有這些例子中,你必須設(shè)置 DocumentRoot ,這樣apache才能知道你存放靜態(tài)文件的位置。 錯(cuò)誤處理 當(dāng)你使用 Apache/mod_python 時(shí),錯(cuò)誤會(huì)被 Django 捕捉,它們不會(huì)傳播到 Apache 那里,也不會(huì)出現(xiàn)在 Apache 的 錯(cuò)誤日志 中。 除非你的 Django 設(shè)置的確出了問(wèn)題。 在這種情況下,你會(huì)在瀏覽器上看到一個(gè) 內(nèi)部服務(wù)器錯(cuò)誤的頁(yè)面,并在 Apache 的 錯(cuò)誤日志 中看到 Python 的完整回溯信息。 錯(cuò)誤日志 的回溯信息有多行。 當(dāng)然,這些信息是難看且難以閱讀的。 處理段錯(cuò)誤 2有時(shí)候,Apache會(huì)在你安裝Django的時(shí)候發(fā)生段錯(cuò)誤。 這時(shí),基本上 總是 有以下兩個(gè)與Django本身無(wú)關(guān)的原因其中之一所造成: 有可能是因?yàn)椋闶褂昧?pyexpat 模塊(進(jìn)行XML解析)并且與Apache內(nèi)置的版本相沖突。 詳情請(qǐng)見(jiàn) /r/articles/expat-apache-crash/. 也有可能是在同一個(gè)Apache進(jìn)程中,同時(shí)使用了mod_python 和 mod_php,而且都使用MySQL作為數(shù)據(jù)庫(kù)后端。 在有些情況下,這會(huì)造成PHP和Python的MySQL模塊的版本沖突。在mod_python的FAQ中有更詳細(xì)的解釋。 如果還有安裝mod_python的問(wèn)題,有一個(gè)好的建議,就是先只運(yùn)行mod_python站點(diǎn),而不使用Django框架。 這是區(qū)分mod_python特定問(wèn)題的好方法。 下面的這篇文章給出了更詳細(xì)的解釋。 /r/articles/getting-modpython-working/. 下一個(gè)步驟應(yīng)該是編輯一段測(cè)試代碼,把你所有django相關(guān)代碼import進(jìn)去,你的views,models,URLconf,RSS配置,等等。 把這些imports放進(jìn)你的handler函數(shù)中,然后從瀏覽器進(jìn)入你的URL。 如果這些導(dǎo)致了crash,你就可以確定是import的django代碼引起了問(wèn)題。 逐個(gè)去掉這些imports,直到不再?zèng)_突,這樣就能找到引起問(wèn)題的那個(gè)模塊。 深入了解各模塊,看看它們的imports。 要想獲得更多幫助,像linux的ldconfig,Mac OS的otool和windows的ListDLLs(form sysInternals)都可以幫你識(shí)別共享依賴(lài)和可能的版本沖突。 一種替代方案: mod_wsgi模塊 作為一個(gè)mod_python模塊的替代,你可以考慮使用mod_wsgi模塊(/p/modwsgi/),此模塊開(kāi)發(fā)的時(shí)間比mod_python的開(kāi)發(fā)時(shí)間離現(xiàn)在更近一些,在Django社區(qū)已有一些使用。 一個(gè)完整的概述超出了本書(shū)的范圍,你可以從官方的Django文檔查看到更多的信息。 使用FastCGI部署Django應(yīng)用 盡管將使用Apache和mod_python搭建Django環(huán)境是最具魯棒性的,但在很多虛擬主機(jī)平臺(tái)上,往往只能使用FastCGI 3此外,在很多情況下,F(xiàn)astCGI能夠提供比mod_python更為優(yōu)越的安全性和效能。 針對(duì)小型站點(diǎn),相對(duì)于Apache來(lái)說(shuō)FastCGI更為輕量級(jí)。 FastCGI 簡(jiǎn)介 如何能夠由一個(gè)外部的應(yīng)用程序很有效解釋W(xué)EB 服務(wù)器上的動(dòng)態(tài)頁(yè)面請(qǐng)求呢? 答案就是使用FastCGI! 它的工作步驟簡(jiǎn)單的描述起來(lái)是這樣的: 和mod_python一樣,F(xiàn)astCGI也是駐留在內(nèi)存里為客戶(hù)請(qǐng)求返回動(dòng)態(tài)信息,而且也免掉了像傳統(tǒng)的CGI一樣啟動(dòng)進(jìn)程時(shí)候的時(shí)間花銷(xiāo)。 但于mod_python不同之處是它并不是作為模塊運(yùn)行在web服務(wù)器同一進(jìn)程內(nèi)的,而是有自己的獨(dú)立進(jìn)程。 為什么要在一個(gè)獨(dú)立的進(jìn)程中運(yùn)行代碼? 在以傳統(tǒng)的方式的幾種以mod_*方式嵌入到Apache的腳本語(yǔ)言中(常見(jiàn)的例如: PHP,Python/mod_python和Perl/mod_perl),他們都是以apache擴(kuò)展模塊的方式將自身嵌入到Apache進(jìn)程中的。 每一個(gè)Apache進(jìn)程都是一個(gè)Apache引擎的副本,它完全包括了所有Apache所具有的一切功能特性(哪怕是對(duì)Django毫無(wú)好處的東西也一并加載進(jìn)來(lái))。 而FastCGI就不一樣了,它僅僅把Python和Django等必備的東東弄到內(nèi)存中。 依據(jù)FastCGI自身的特點(diǎn)可以看到,F(xiàn)astCGI進(jìn)程可以與Web服務(wù)器的進(jìn)程分別運(yùn)行在不同的用戶(hù)權(quán)限下。 對(duì)于一個(gè)多人共用的系統(tǒng)來(lái)說(shuō),這個(gè)特性對(duì)于安全性是非常有好處的,因?yàn)槟憧梢园踩挠趧e人分享和重用代碼了。 如果你希望你的Django以FastCGI的方式運(yùn)行,那么你還必須安裝 flup 這個(gè)Python庫(kù),這個(gè)庫(kù)就是用于處理FastCGI的。 很多用戶(hù)都抱怨 flup 的發(fā)布版太久了,老是不更新。 其實(shí)不是的,他們一直在努力的工作著,這是沒(méi)有放出來(lái)而已。 1運(yùn)行你的 FastCGI 服務(wù)器 FastCGI是以客戶(hù)機(jī)/服務(wù)器方式運(yùn)行的,并且在很多情況下,你得自己去啟動(dòng)FastCGI的服務(wù)進(jìn)程。 Web服務(wù)器(例如Apache,lighttpd等等)僅僅在有動(dòng)態(tài)頁(yè)面訪(fǎng)問(wèn)請(qǐng)求的時(shí)候才會(huì)去與你的Django-FastCGI進(jìn)程交互。 因?yàn)镕ast-CGI已經(jīng)一直駐留在內(nèi)存里面了的,所以它響應(yīng)起來(lái)也是很快的。 記錄 在虛擬主機(jī)上使用的話(huà),你可能會(huì)被強(qiáng)制的使用Web server-managed FastCGI進(jìn)程。 在這樣的情況下,請(qǐng)參閱下面的“在Apache共享主機(jī)里運(yùn)行Django”這一小節(jié)。 web服務(wù)器有兩種方式于FastCGI進(jìn)程交互: 使用Unix domain socket(在win32里面是 命名管道 )或者使用TCP socket.具體使用哪一個(gè),那就根據(jù)你的偏好而定了,但是TCP socket弄不好的話(huà)往往會(huì)發(fā)生一些權(quán)限上的問(wèn)題。 What you choose is a manner of preference; a TCP socket is usually easier due to permissions issues. 2開(kāi)始你的服務(wù)器項(xiàng)目,首先進(jìn)入你的項(xiàng)目目錄下(你的 manage.py 文件所在之處),然后使用 manage.py runfcgi 命令: ./manage.py runfcgi options想了解如何使用 runfcgi ,輸入 manage.py runfcgi help 命令。 你可以指定 socket 或者同時(shí)指定 host 和 port 。當(dāng)你要?jiǎng)?chuàng)建Web服務(wù)器時(shí),你只需要將服務(wù)器指向當(dāng)你在啟動(dòng)FastCGI服務(wù)器時(shí)確定的socket或者h(yuǎn)ost/port。 范例: 在TCP端口上運(yùn)行一個(gè)線(xiàn)程服務(wù)器: ./manage.py runfcgi method=threaded host= port=3033在Unix socket上運(yùn)行prefork服務(wù)器: ./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid啟動(dòng),但不作為后臺(tái)進(jìn)程(在調(diào)試時(shí)比較方便): ./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock停止FastCGI的行程 如果你的FastCGI是在前臺(tái)運(yùn)行的,那么只需按Ctrl+C就可以很方便的停止這個(gè)進(jìn)程了。 但如果是在后臺(tái)運(yùn)行的話(huà),你就要使用Unix的 kill 命令來(lái)殺掉它。 然而,當(dāng)你正在處理后臺(tái)進(jìn)程時(shí),你會(huì)需要將其付諸于Unix kill的命令 如果你在 manage.py runfcgi 中指定了 pidfile 這個(gè)選項(xiàng),那么你可以這樣來(lái)殺死這個(gè)FastCGI后臺(tái)進(jìn)程: kill cat $PIDFILE$PIDFILE 就是你在 pidfile 指定的那個(gè)。 你可以使用下面這個(gè)腳本方便地重啟Unix里的FastCGI守護(hù)進(jìn)程: #!/bin/bash# Replace these three settings.PROJDIR=/home/user/myprojectPIDFILE=$PROJDIR/mysite.pidSOCKET=$PROJDIR/mysite.sockcd $PROJDIRif -f $PIDFILE ; then kill cat - $PIDFILE rm -f - $PIDFILEfiexec /usr/bin/env - PYTHONPATH=./python:. ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE在Apache中以FastCGI的方式使用Django 在Apache和FastCGI上使用Django,你需要安裝和配置Apache,并且安裝mod_fastcgi。 請(qǐng)參見(jiàn)Apache和mod_fastcgi文檔: /r/mod_fastcgi/ 。 當(dāng)完成了安裝,通過(guò) httpd.conf (Apache的配置文件)來(lái)讓Apache和Django FastCGI互相通信。 你需要做兩件事: 使用 FastCGIExternalServer 指明FastCGI的位置。 使用 mod_rewrite 為FastCGI指定合適的URL。 指定 FastCGI Server 的位置 FastCGIExternalServer 告訴Apache如何找到FastCGI服務(wù)器。按照FastCGIExternalServer 文檔( /r/mod_fastcgi/FastCGIExternalServer/ ),你可以指明 socket 或者 host 。以下是兩個(gè)例子: # Connect to FastCGI via a socket/named pipe:FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock# Connect to FastCGI via a TCP host/port:FastCGIExternalServer /home/user/public_html/mysite.fcgi -host :3033在這兩個(gè)例子中, /home/user/public_html/ 目錄必須存在,而 /home/user/public_html/mysite.fcgi 文件不一定存在。 它僅僅是一個(gè)Web服務(wù)器內(nèi)部使用的接口,這個(gè)URL決定了對(duì)于哪些URL的請(qǐng)求會(huì)被FastCGI處理(下一部分詳細(xì)討論)。 (下一章將會(huì)有更多有關(guān)于此的介紹) 使用mod_rewrite為FastCGI指定URL 第二步是告訴Apache為符合一定模式的URL使用FastCGI。為了實(shí)現(xiàn)這一點(diǎn),請(qǐng)使用mod_rewrite 模塊,并將這些URL重定向到 mysite.fcgi (或者正如在前文中描述的那樣,使用任何在 FastCGIExternalServer 指定的內(nèi)容)。 在這個(gè)例子里面,我們告訴Apache使用FastCGI來(lái)處理那些在文件系統(tǒng)上不提供文件(譯者注: ServerName DocumentRoot /home/user/public_html Alias /media /home/user/python/django/contrib/admin/media RewriteEngine On RewriteRule /(media.*)$ /$1 QSA,L RewriteCond %REQUEST_FILENAME !-f RewriteRule /(.*)$ /mysite.fcgi/$1 QSA,LFastCGI 和 lighttpd lighttpd (/r/lighttpd/) 是一個(gè)輕量級(jí)的Web服務(wù)器,通常被用來(lái)提供靜態(tài)頁(yè)面的訪(fǎng)問(wèn)。 它天生支持FastCGI,因此除非你的站點(diǎn)需要一些Apache特有的特性,否則,lighttpd對(duì)于靜態(tài)和動(dòng)態(tài)頁(yè)面來(lái)說(shuō)都是理想的選擇。 確保 mod_fastcgi 在模塊列表中,它需要出現(xiàn)在 mod_rewrite 和 mod_access ,但是要在 mod_accesslog 之前。 將下面的內(nèi)容添加到你的lighttpd的配置文件中: server.document-root = /home/user/public_htmlfastcgi.server = ( /mysite.fcgi = ( main = ( # Use host / port instead of socket for TCP fastcgi # host = , # port = 3033, socket = /home/user/mysite.sock, check-local = disable, ) ),)alias.url = ( /media/ = /home/user/django/contrib/admin/media/,)url.rewrite-once = ( (/media.*)$ = $1, /favicon.ico$ = /media/favicon.ico, (/.*)$ = /mysite.fcgi$1,)在一個(gè)lighttpd進(jìn)程中運(yùn)行多個(gè)Django站點(diǎn) lighttpd允許你使用條件配置來(lái)為每個(gè)站點(diǎn)分別提供設(shè)置。 為了支持FastCGI的多站點(diǎn),只需要在FastCGI的配置文件中,為每個(gè)站點(diǎn)分別建立條件配置項(xiàng): 1# If the hostname is .$HTTPhost = server.document-root = /foo/site1 fastcgi.server = ( . ) .# If the hostname is .$HTTPhost = server.document-root = /foo/site2 fastcgi.server = ( . ) .你也可以通過(guò) fastcgi.server 中指定多個(gè)入口,在同一個(gè)站點(diǎn)上實(shí)現(xiàn)多個(gè)Django安裝。 請(qǐng)為每一個(gè)安裝指定一個(gè)FastCGI主機(jī)。 在使用Apache的共享主機(jī)服務(wù)商處運(yùn)行Django 許多共享主機(jī)的服務(wù)提供商不允許運(yùn)行你自己的服務(wù)進(jìn)程,也不允許修改 httpd.conf 文件。 盡管如此,仍然有可能通過(guò)Web服務(wù)器產(chǎn)生的子進(jìn)程來(lái)運(yùn)行Django。 記錄 如果你要使用服務(wù)器的子進(jìn)程,你沒(méi)有必要自己去啟動(dòng)FastCGI服務(wù)器。 Apache會(huì)自動(dòng)產(chǎn)生一些子進(jìn)程,產(chǎn)生的數(shù)量按照需求和配置會(huì)有所不同。 在你的Web根目錄下,將下面的內(nèi)容增加到 .htaccess 文件中: AddHandler fastcgi-script .fcgiRewriteEngine OnRewriteCond %REQUEST_FILENAME !-fRewriteRule (.*)$ mysite.fcgi/$1 QSA,L接著,創(chuàng)建一個(gè)腳本,告知Apache如何運(yùn)行你的FastCGI程序。 創(chuàng)建一個(gè) mysite.fcgi 文件,并把它放在你的Web目錄中,打開(kāi)可執(zhí)行權(quán)限。 #!/usr/bin/pythonimport sys, os# Add a custom Python path.sys.path.insert(0, /home/user/python)# Switch to the directory of your project. (Optional.)# os.chdir(/home/user/myproject)# Set the DJANGO_SETTINGS_MODULE environment variable.os.environDJANGO_SETTINGS_MODULE = myproject.settingsfrom django.core.servers.fastcgi import ru
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年工程法規(guī)考試考前心理調(diào)適方法試題及答案
- 2025職業(yè)教育產(chǎn)教融合項(xiàng)目資金申請(qǐng)項(xiàng)目資金申請(qǐng)策略與實(shí)施路徑報(bào)告
- 商品代銷(xiāo)合同協(xié)議書(shū)
- 高效解析財(cái)務(wù)管理考試試題及答案
- 合同解除中止協(xié)議書(shū)
- 社會(huì)行為學(xué)的理論模型與實(shí)踐試題及答案
- 2025年多式聯(lián)運(yùn)信息平臺(tái)在物流行業(yè)物流行業(yè)物流行業(yè)智能化升級(jí)中的應(yīng)用與策略報(bào)告
- 性別不平等的社會(huì)學(xué)分析試題及答案
- 基于2025的高校創(chuàng)新創(chuàng)業(yè)教育課程體系與創(chuàng)新創(chuàng)業(yè)教育課程體系改革實(shí)施策略研究報(bào)告
- 2025至2030年中國(guó)期貨業(yè)務(wù)處理系統(tǒng)市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 中國(guó)生鐵行業(yè)發(fā)展現(xiàn)狀及市場(chǎng)前景分析預(yù)測(cè)報(bào)告
- 2025年保密教育線(xiàn)上培訓(xùn)考試試題及答案
- JJG 693-2011可燃?xì)怏w檢測(cè)報(bào)警器
- GB/T 22554-2010基于標(biāo)準(zhǔn)樣品的線(xiàn)性校準(zhǔn)
- 八項(xiàng)規(guī)定知識(shí)測(cè)試習(xí)題庫(kù)帶答案版(打印版)
- 操作系統(tǒng)-作業(yè)實(shí)驗(yàn)1存儲(chǔ)管理
- 多學(xué)科診療糖尿病足病例分享
- 施工進(jìn)度計(jì)劃網(wǎng)絡(luò)圖、橫道圖
- 汽車(chē)起重機(jī)檢查及記錄表(月檢)
- 公司委托經(jīng)營(yíng)協(xié)議
- 實(shí)用美學(xué)第九講飲食美學(xué)課件
評(píng)論
0/150
提交評(píng)論