版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第一章簡介1.1性能使用mod_python的主要優(yōu)勢在于比傳統(tǒng)cgi更高的性能。一個測試,使用在pentium 1.2ghz的機器上運行red hat linux 7.3。使用4種類型的腳本,基于標(biāo)準(zhǔn)的cgi導(dǎo)入模塊(以典型的python cgi腳本開始),然后輸出hello!,測試10000次請求作為基準(zhǔn)。標(biāo)準(zhǔn)cgi: 23 次請求/秒mod_python cgi處理器: 385 次請求/秒mod_python 發(fā)布處理器: 476 次請求/秒mod_python 處理器: 1203 次請求/秒1.2可移植性apache是按照階段處理請求的(比如:讀取請求、處理請求頭、檢查存取等)。這些階
2、段可以分別用處理器調(diào)用的函數(shù)來實現(xiàn)。傳統(tǒng)上,使用c語言編寫處理器模塊。mod_python提供了使用python拜你些apache處理器擴展apache功能的方法。更多的apache請求處理過程,參考apache api notes,或者參考mod_python-integrating python with apache文件。為了方便的從cgi移植,標(biāo)準(zhǔn)的mod_python處理器提供了cgi模擬環(huán)境,允許用戶不修改遺留下來的腳本,而在大多數(shù)時候無需進(jìn)行任何修改。參考:apache開發(fā)者資源/python1
3、0/mod_python-整合python和apache,出現(xiàn)在python 10(?)1.3歷史mod_python起源于httpdapy項目(1997)。很久以后httpdapy才被叫做mod_python,因為httpdapy并不是特定用于apache服務(wù)器的。httpdapy設(shè)計成跨平臺的,而實際上主要從netscape服務(wù)器開始(追溯到1997年的nsapy)。摘錄自httpdapy項目的readme文件的描述將python嵌入到apache服務(wù)器的挑戰(zhàn)與解決方法。 #小字體在我多年前開發(fā)第一個web應(yīng)用程序時就發(fā)現(xiàn)cgi訪問數(shù)據(jù)庫非常慢,因為每次點擊請求都會裝入解釋器并執(zhí)行數(shù)mb的
4、數(shù)據(jù)。數(shù)據(jù)庫往往都很大,并將大量時間浪費在數(shù)據(jù)庫的連接/認(rèn)證等意義重大的事情上,像dns查詢、編碼與解碼、內(nèi)存分配等等。在應(yīng)用提速的壓力下,我嘗試過使用python和多種工具的綜合使用。我并不迷信微軟的asp,又被netscape的性能和滿是臭蟲而郁悶。cold fusion(冷聚變)看起來有希望,但我稍后學(xué)會了html類標(biāo)簽的書寫方式,可讀性跟匯編有一拼。比如php。但是我真的很想用python來寫東西。就在同時有關(guān)python互聯(lián)網(wǎng)編程的書籍出版了,其中將python嵌入到netscape服務(wù)器的方式立即引起了我的注意。我在我的項目中使用了這個例子,并在稍后開發(fā)了我自己的改進(jìn)版,叫做nsa
5、py,并在windowsnt和solaris上編譯。盡管nsapy僅能工作在netscape服務(wù)器上,但是出于靈活通用的面向?qū)ο笤O(shè)計,在python精靈中,很容易移植到其他的web服務(wù)器。后來,曾經(jīng)流行的netscape服務(wù)器掛了,我就將nsapy移植到最流行的服務(wù)器apache上。所以從nsapy衍生出了httpdapy。繼續(xù)這個傳奇,你會想到將httpdapy移植到其他服務(wù)器上,實際上他們比預(yù)想要復(fù)雜而且枯燥。反之,提供一個類似于perl語言的apache擴展mod_perl一樣或更好性能的部件會更有意思。俱往矣,mod_python的第一個版本發(fā)布于2000年5月。完成.第二章安裝注意:
6、獲得關(guān)于安裝的幫助和其他問題的最好地方是mod_python的郵件列表??梢园l(fā)送標(biāo)題為subscribe的郵件到mod_。2.1先決條件 python 2.2.1或更新的版本,早起版本將無法使用。 apache 2.0.40或更新的版本,如果要使用apache 1.3.x,請使用mod_python的版本2.7.x。編譯mod_python需要有apache和python的包含文件,并且確保安裝了python標(biāo)準(zhǔn)庫。如果你從源代碼安裝了python和apache,那么你已經(jīng)擁有了這些了。如果你使用了預(yù)打包軟件,如rpm或其他方式則只有二進(jìn)制
7、版本,而沒有源碼。通常apache和python的包含文件和庫文件在各自的development包中。如果你不確定擁有這些重要文件,請從源碼安裝python和apache,或者閱讀你系統(tǒng)的文檔以了解如何獲得開發(fā)包。2.2編譯有兩種鏈接apache模塊的方式:靜態(tài)的和dso方式。dso方式現(xiàn)在非常流行,并推薦用于mod_python的安裝。模塊被編譯成共享庫,并在運行時動態(tài)裝入。dso方式的優(yōu)勢在于安裝模塊時無需重新編譯apache。關(guān)于dso機制的詳細(xì)信息參見/docs-2.0/dso.html。當(dāng)前版本的mod_python僅支持dso方式。靜態(tài)鏈
8、接是一種較老的方式,比動態(tài)連接的方式支持更多的平臺,但是較少使用。主要的缺陷是必須要重新編譯apache,在很多情況下并不是一個好的選擇。2.2.1運行./configure./configure腳本將會分析你的運行環(huán)境,并創(chuàng)建自定義的make文件用于你的系統(tǒng)。使用autoconf生成的./configure包含如下內(nèi)容: 查看apxs程序是否存在。這個程序作為apache標(biāo)準(zhǔn)發(fā)行版的一部分提供dso支持。如果找不到則無法實現(xiàn)dso功能。使用-with-apxs指定選項:$ ./configure -with-apxs=/usr/local/apache/bin/apxs強烈建議使用這個選項。
9、 檢查python版本,并嘗試找到libpython參數(shù)變量的二進(jìn)制發(fā)行版。缺省時可以在path變量中找到python。如果找到的首個python二進(jìn)制版本不適合mod_python,則可以手動指定python的路徑使用-with-python,如:$ ./configure -with-python=/usr/local/bin/python2.3 設(shè)置mod_python保留的互斥鎖數(shù)量。在某些系統(tǒng)中,互斥鎖是一種有限的資源。增加最大互斥鎖數(shù)量將會增加使用session鎖定的性能。缺省值是8,一個性能不錯的數(shù)值是32。使用-with-max-locks選項:$ ./configure -w
10、ith-max-locks=32這個選項是在3.2.0版本開始提供的。 嘗試查找flex并確定版本。如果path中找不到flex則configure會出錯。如果版本不對則會給出警告。一般可以忽略這個警告,除非需要重新創(chuàng)建src/psp_parser.c。剖析器(parser)會被psp調(diào)用,使用flex的c語言書寫。要求的版本是2.5.31,在大多數(shù)平臺上2.5.4并不合適。所以已經(jīng)源碼里已經(jīng)包含了一個psp_parser.c的副本。如果需要編譯src/psp_parser.c則需要獲取正確版本的flex。如果path中的flex版本有誤,則可用-with-flex選項:$ ./configu
11、re -with-flex=/usr/local/bin/flex這是3.2.0版本中的新特性 構(gòu)建mod_python文檔時需要用到python的源代碼。可以如果不需要文檔,可以忽略這個選項。如果需要則用-with-python-src選項:$ ./configure -with-python-src=/usr/src/python2.3這個是3.2.0版本中的新特性2.2.2運行make開始構(gòu)建過程,簡單的運行如下即可:$ make2.3安裝2.3.1運行make install這個安裝過程必須在root用戶下完成:$ su# make install這將會簡單的將二進(jìn)制版本復(fù)制到apac
12、he的libexec目錄。并且會安裝python-libraries到site-packages并編譯他們。如果你想只安裝python庫或者只安裝dso,可以用如下make目標(biāo):# make install_py_lib# make install_dso2.3.2配置apache按照dso模式安裝的apache,需要在httpd.conf中加入啟動mod_python的句子:loadmodule python_module libexec/mod_python.so實際的mod_python.so路徑可能有所變化,但是make install將會顯示這個文件的確切路徑。2.4測試注意次部分內(nèi)
13、容僅適用于3.x版本,如果使用2.7.x版本,你需要找到更適合的文檔。 創(chuàng)建一個在web站點可見的目錄,如htdocs/test。 在httpd.conf或者.htaccess文件中添加如下內(nèi)容。如果是在.htaccess文件中,則無需標(biāo)簽。并且確保httpd.conf文件中的allowoverride目標(biāo)至少包含fileinfo,缺省是none,將會無法工作。addhandler mod_python .pypythonhandler mptestpythondebug on 重定向所有以.py結(jié)尾的url到mod_python處理器。mod_python收到請求之后查找合適的處理器來處理請
14、求。這里有個簡單的自定義處理器叫mptest。我們看看如何定義這個處理器。 此時如果修改了主配置文件httpd.conf則需要重啟apache來使之生效。 編輯mptest.py文件在htdocs/test目錄。from mod_python import apachedef handler(req):req.content_type=text/plainreq.write(hello, world!)return apache.ok 指向url路徑到mptest.py。將會看到hello, world!。如果看不到則參考故障處理。 依照配置文件的規(guī)則,指定任何.py文件都會最終指向mptes
15、t.py做處理。因為已經(jīng)明確的指定了mptest做處理器。如果需要用不同的處理器處理不同的文件則需要更高層的處理器,比如publisher發(fā)布器、mpservlets或vampire。這些都是動態(tài)裝入的處理器。 如果都運行無誤則轉(zhuǎn)入第三章,入門。參考:.au/projects/vampire2.5故障處理如果出現(xiàn)問題,可以按照如下的處理: 檢查錯誤輸出 檢查服務(wù)器錯誤日志 單處理執(zhí)行apache$ ./httpd -x這樣將會顯示更多有用信息 從mod_python3.2.0開始,可以使用mod_python.testhandler來診斷你的配置。添加到httpd.conf文件:sethand
16、ler mod_pythonpythonhandler mod_python.testhandler這時指向你的/mpinfo的url則會顯示一些信息幫助處理mod_python的問題。 在mod_python郵件列表提問,并確保提供如下信息:mod_python版本操作系統(tǒng)類型、名字、版本號python版本、非常規(guī)的編輯選項apache服務(wù)器版本相關(guān)的apache配置,.htaccess相關(guān)的python代碼完成.第三章指南3.1使用發(fā)布器(publisher)的快速例子這一節(jié)提供無需太多細(xì)節(jié)的發(fā)布器指南。更多如何使用mod_python處理器的細(xì)節(jié)將在以后解釋。發(fā)布器(publisher)
17、提供了發(fā)布mod_python標(biāo)準(zhǔn)模塊的方式。需要在配置文件中加入如下配置:addhandler mod_python .pypythonhandler mod_python.publisherpythondebug on下例會返回簡單的表單數(shù)據(jù)。詢問姓名、電子郵件、注釋之后將會給管理員發(fā)郵件。這個簡單的應(yīng)用程序由兩個文件組成:form.html用于提交數(shù)據(jù),form.py用于處理表單動作。如下是表單:please provide feedback below:name: email: comment: 注意表單的action屬性指向form.py/email調(diào)用,如下創(chuàng)建form.py,如下
18、:import smtplibwebmaster=webmaster #管理員電郵smtp_server=localhost #本機smtp服務(wù)器def email(req,name,email,comment):#一定要確保用戶提供了所有的參數(shù)if not(name and email and comment):return 缺少必要的參數(shù)#創(chuàng)建消息文本msg= from: %ssubject: feedbackto: %si have the following comment:%sthank you,%s % (email,webmaster,comment,name)#發(fā)送信息conn
19、=smtplib.smtp(smtp_server)conn.sendmail(email,webmaster,msg)conn.quit()#提供返回頁面s=dear %s,thank you for your kind comments, wewill get back to you shortly. % namereturn name當(dāng)用戶點擊提交按鈕時,發(fā)布器將會裝入email函數(shù)到form模塊,傳遞表單字段作為關(guān)鍵字參數(shù)。也會傳遞請求對象到req。注意逆必須要有req參數(shù)。發(fā)布器已經(jīng)可以很聰明的傳遞必要的參數(shù)。函數(shù)的返回值將被發(fā)送到客戶端瀏覽器。即使使用發(fā)布器可以非常簡單的處理,但是
20、程序仍然可以利用mod_python的強大功能,比如調(diào)用請求對象。當(dāng)然也可以調(diào)用本地的mod_python處理器來完成大量的工作。比如設(shè)置html頭路由req.headers_out;返回錯誤拋出apache.server_error異常;從客戶端的重定向讀寫文件req.write()和req.read(),等等。閱讀6.1節(jié)了解更多關(guān)于發(fā)布器的詳細(xì)信息。3.2apache處理器概覽節(jié)標(biāo)題翻譯有誤,應(yīng)為快速學(xué)習(xí)apache如何處理請求。如果你想要深入鉆研mod_python的功能,需要理解什么是處理器。apache分階段(phase)處理請求。比如第一個階段是用戶認(rèn)證,之后是檢驗用戶是否有權(quán)訪
21、問特定的文件,然后是讀取文件并發(fā)送到客戶端。一個典型的靜態(tài)文件請求包含三個階段:1.翻譯uri到文件位置2.讀取文件并發(fā)送到客戶端3.記錄請求日志。更復(fù)雜的處理依賴于配置文件。一個處理器就是初始處理某個階段的函數(shù)。同一個階段可以有多于一個處理器進(jìn)行處理,被叫做apache序列。對應(yīng)每個階段有個缺省的apache處理器(大多數(shù)只做缺省動作或者什么都不作)。然后由其他的apache模塊提供處理器,比如mod_python。mod_python提供了apache每一個重要的處理器。mod_python處理器缺省時不會做任何事情,除非用特定的配置文件標(biāo)志。這些標(biāo)志以python開始并以handler結(jié)
22、尾(如:pythonauthenhandler),指定python函數(shù)來處理指定的階段。所以mod_python的主函數(shù)只是作為發(fā)報機的角色連接apache處理器和python函數(shù)。最常用的處理器是pythonhandler。它處理含有上下文的請求。因為它沒有名字,所以有時也成為通用處理器。這個處理器的apache缺省行為是讀取文件并發(fā)送到客戶端。大多數(shù)應(yīng)用應(yīng)該重寫這個處理器。3.3mod_python做了什么我們假設(shè)有如下配置:addhandler mod_python .pypythonhandler myscriptpythondebug on所以還需要一個如下文件,/mywebdir/
23、myscript.py如下:from mod_python import apachedef handler(req):req.content_type=text/plainreq.write(hello world!)return apache.ok如下的事情將會發(fā)生:addhandler標(biāo)志告訴apache所有的以.py結(jié)尾的/mywebdir下或其子目錄下的文件請求都由mod_python負(fù)責(zé)處理。pythonhandler myscript標(biāo)志告訴mod_python通用處理器在myscript腳本。pythondebug on標(biāo)志告訴mod_python如果發(fā)生錯誤,則把錯誤信息輸出
24、到客戶端,便于開發(fā)。當(dāng)請求到來時,apache開始分步驟處理請求并講請求發(fā)送到mod_python。mod_python處理器檢查配置獲取處理器。在本例,我們除了通用處理器之外沒有調(diào)用其他東西。當(dāng)讀取配置到pythonhandler myscript時,會發(fā)生下面的事情:1.如果沒有做過,假設(shè)預(yù)設(shè)目錄已經(jīng)存在于sys.path中。2.嘗試按名字導(dǎo)入模塊myscript。注意子目錄是不在sys.path中的,如果需要只能按照包名的方式調(diào)用。3.在myscript中查找函數(shù)handler4.調(diào)用這個函數(shù)并傳遞請求對象(關(guān)于請求對象的更多東西在后面)5.在這里我們細(xì)致研究一下腳本:from mod_
25、python import apache導(dǎo)入apache模塊來獲取apache的接口。大多數(shù)mod_python程序需要有這一行。def handler(req):這是處理器函數(shù)的聲明。叫做handler是因為mod_python按照配置標(biāo)志尋找函數(shù)。將配置標(biāo)志轉(zhuǎn)換成小寫,然后去掉python即可。這樣pythonhandler就成了handler。當(dāng)然也可以用其他的名字,但是需要用:來分隔函數(shù)名,比如一個處理器函數(shù)叫spam,那么配置標(biāo)志就是pythonhandler myscript:spam注意,處理器必須包含一個請求對象參數(shù)。請求對象提供了關(guān)于請求的大量信息,比如客戶端的ip,請求頭,
26、url等。向客戶端發(fā)送信息也需要用到請求對象,這里是沒有response對象的。req.content_type=text/plain設(shè)置文檔mime類型為text/plain。缺省的是text/html,但是如果處理器沒有打算返回html,那么text/plain更恰當(dāng)(appropriate)一些。特別注意:需要在req.write方法之前調(diào)用如上語句,因為一旦調(diào)用req.write,http響應(yīng)頭就被發(fā)送出去了,其后的http響應(yīng)頭的改變都會忽略。req.write(hello world!)將會把字符串寫入到客戶端。return apache.ok告知apache,請求處理完成并成功。
27、如果沒有返回ok,則apache會自動返回為apache.http_internal_server_error或return apache.http_forbidden。當(dāng)處理失敗時會在錯誤日志中記錄,并告知客戶端一點錯誤信息。小技巧:如果你注意到,會發(fā)現(xiàn)如果請求的url不是指向myscript.py,而只是一個.py結(jié)尾的文件,哪怕是一個不存在的文件,也可以得到相同的結(jié)果。因為服務(wù)器只是將特定結(jié)尾的處理直接交給相關(guān)模塊的,而并不要求那一定是一個存在的文件。3.4更復(fù)雜的例子-認(rèn)證現(xiàn)在,你知道寫一個處理器多么的簡單,下面我們來顯示一個更復(fù)雜的例子。如果需要用密碼來保護(hù)一個目錄。比如登錄名為sp
28、am,密碼為eggs。首先需要告訴apache在需要認(rèn)證時調(diào)用我們的認(rèn)證處理器。加入pythonauthenhandler標(biāo)志到配置文件:addhandler mod_python .pypythonhandler myscriptpythonauthenhandler myscriptpythondebug on因為一個模塊可以包含多個函數(shù),所以也可以在一個模塊中使用多個處理器。然后是告知apache,使用basic http認(rèn)證。僅限有效用戶進(jìn)入。配置如下:addhandler mod_python .pypythonhandler myscriptpythonauthenhandler
29、myscriptpythondebug onauthtype basicauthname restricted arearequire valid-user然后在myscript.py中寫認(rèn)證函數(shù),一個簡單認(rèn)證函數(shù)如下:from mod_python import apachedef authenhandler(req):pw=req.get_basic_auth_pw()user=req.userif user=spam and pw=eggs:return apache.okelse:return apache.http_unauthorized如下是逐行解釋:def authenhand
30、ler(req):認(rèn)證函數(shù)的聲明,至于為什么叫這個名字,自己可以參考命名規(guī)則。pw=req.get_basic_auth_pw()這里獲取密碼。basic http認(rèn)證采用base64編碼發(fā)送到服務(wù)器。這個函數(shù)返回的直接就是密碼了。注意必須在獲取用戶名之前先獲取密碼。user=req.user獲取用戶名if user=spam and pw=eggs:return apache.ok對比用戶名和密碼的值,如果正確返回告知驗證成功,并進(jìn)入下一個階段的處理。在本例里下一個階段是handler()。else:return apache.http_unauthorized告知apache驗證失敗。這通
31、常會導(dǎo)致客戶端瀏覽器彈出對話框要求用戶名和密碼。實測:發(fā)現(xiàn)我使用的httpd-2.0.55提示驗證類型無效,一共兩種驗證類型,一種是basic一種是digest,都是不允許的。就是按照如上例子。終于實驗成功了,最上面的配置必須寫在httpd.conf中才會有效,寫在.htaccess中無效。無論是否指定了allowoverride fileinfo都是。這樣進(jìn)入一個目錄之后會彈出系統(tǒng)的對話框提示輸入用戶名密碼。驗證成功后只要瀏覽器不關(guān)閉就可以繼續(xù)進(jìn)入這個目錄,但是關(guān)閉后就需要再次驗證。3.5你自己的404處理器在某些時候,如果希望返回404(http_not_found)或者其他非200的結(jié)果
32、到客戶端,這里有個竅門。如果從你的處理器返回http_not_found, apache將會生成錯誤頁。但是卻未必是你喜歡的錯誤頁。這時,你只要設(shè)置req.status=apache.http_not_found,提交你的頁面,然后返回apache.ok就可以了:from mod_python import apachedef handler(req):if req.filename-17:=apache-error.html:#放行apache的錯誤頁if req.filename-18:=handler-error.html:#使用自己的錯誤頁req.status=apache.http_
33、not_foundpagebuffer=頁面不存在else:#使用文件內(nèi)容pagebuffer=open(req.filename,r).read()#輸出錯誤頁req.write(pagebuffer)return(apache.ok)完成.第四章 python api4.1多解釋器使用mod_python工作的時候應(yīng)該理解,并不是使用python在命令行下寫腳本,而是用python調(diào)用c語言api。python的c語言api提供了創(chuàng)建子解釋器的能力。關(guān)于子解釋器的更多信息詳見py_newinterpreter()函數(shù)。在這里,每個子解釋器擁有獨立的命名空間,并與其他子解釋器不可訪問。子解釋
34、器非常適合于理解同一個服務(wù)器中處理各個請求的進(jìn)程。服務(wù)器啟動mod_python的時候會啟動一個主解釋器。主解釋器包含子解釋器詞典。剛開始詞典是空的。對應(yīng)每一個請求就會創(chuàng)建一個子解釋器,并將引用存儲在詞典里。這個詞典用解釋器名作為鍵名,主解釋器叫做main_interpreter。其他的解釋器受到pythoninterp*的控制。缺省的行為是使用apache虛擬服務(wù)器名來命名(servername標(biāo)志)。這意味著同一個虛擬服務(wù)器中的腳本在同一個子解釋器中執(zhí)行,但不再同一個虛擬服務(wù)器中的腳本因為不同的子解釋器而無法互相訪問。pythoninterpperdirectory和pythoninter
35、pperdirective標(biāo)志改變(alter)命名慣例(convention)到要存取的絕對路徑,或者在python*handler可以訪問到的地方,分別的(respectively)。pythoninterpreter能夠強制使用解釋器名重載所有的命名慣例。一旦創(chuàng)建,一個子解釋器將會被接踵而來的請求重用,在apache停止之前不會被銷毀。從調(diào)用erpreter可以獲取當(dāng)前的解釋器名。參考python的c語言api:/doc/current/api/api.html4.2請求(request)處理器一個請求處理器是處理請求階段細(xì)節(jié)的處理器
36、。apache在處理請求的每一個階段都對調(diào)用相應(yīng)的處理器。對每一個階段都會調(diào)用請求處理器,由apache的核心或者模塊提供,比如mod_python由用戶的python函數(shù)提供。用python書寫的處理器只要遵守如下規(guī)則就與c寫的沒有區(qū)別:處理器函數(shù)總是會傳遞請求對象的引用,一般是req變量。每個處理器可以返回如下: apache.ok:這個階段處理無誤 apache.declined:這個階段處理過后還需要隊列中的其他模塊處理 apache.http_error:發(fā)生了http錯誤,如下值:http_continue 100http_switching_protocols 101http_p
37、rocessing 102http_ok 200http_created 201http_accepted 202http_non_authoritative 203http_no_content 205http_partial_content 206http_multi_status 207http_multiple_choices 300http_moved_permanently 301http_movedtemporarily 302http_see_other 303http_not_modified 304http_use_proxy 305http_temporary_redir
38、ect 307http_bad_request 400http_unauthorized 401http_payment_required 402http_forbidden 403http_not_found 404http_method_not_allowed 405http_not_acceptable 406http_proxy_authentication_required 407http_request_time_out 408http_conflict 409http_gone 410http_length_required 411http_precondition_failed
39、 412http_request_entity_too_large 413http_request_uri_too_large 414http_unsupported_media_type 415http_range_not_satisfiable 416http_expectation_failed 417http_unprocessable_entity 422http_locked 423http_failed_dependency 424http_internal_server_error 500http_not_implemented 501http_bad_gateway 502h
40、ttp_service_unavailable 503http_gateway_time_out 504http_version_not_supported 505http_variant_also_varies 506http_insufficient_storage 507http_not_extended 510可以通過拋出apache.server_return異常來返回錯誤碼,并將http錯誤碼作為異常的參數(shù)。例如:raise apache.server_return, apache.http_forbidden處理器可以通過req.write()方法將文檔發(fā)送到客戶端??蛻舳颂峤坏?/p>
41、數(shù)據(jù)可以通過req.read()讀取。注意:python*handler所在的目錄必須已經(jīng)在sys.path中,如果沒有在配置段指定則不會在。一個請求處理器的例子:from mod_python import apachedef requesthandler(req):req.content_type=text/plainreq.write(hello world!)return apache.ok4.3過濾(filter)處理器過濾處理器可以改變服務(wù)器的輸入和輸出。分兩種:輸入和輸出的過濾?,F(xiàn)在mod_python僅提供請求級別(request-level)的過濾器,就是http的請求和回應(yīng)
42、體可以被過濾。未來的apache將會提供連接級別(connection-level)的過濾器。過濾處理器接收一個filter對象做參數(shù),請求對象可經(jīng)由此得出filter.req,但是所有的讀寫動作必須經(jīng)由filter的方法。過濾器在讀到none時需要被關(guān)閉,代表流的結(jié)束。過濾器的返回值將會被忽略,但可用filter.pass_on()方法達(dá)到同樣的效果。過濾器必須一開始就注冊為pythoninputfilter或pythonoutputfilter,然后添加到apache的配置標(biāo)志add/setinputfilter或add/setoutputfilter。如下例子把所有.py結(jié)尾文件用cap
43、italize過濾器處理,如下是配置:pythonoutputfilter capitalize capitalizeaddoutputfilter captitalize .py如下是文件capitalize.py的內(nèi)容:from mod_python import apachedef outputfilter(filter):s=filter.read()while s:filter.write(s.upper()s=filter.read()if s is none:filter.close()書寫過濾器時應(yīng)該注意到過濾器隨時都會被調(diào)用。過濾器無法控制數(shù)據(jù)的總量,也無法確定請求何時調(diào)用。
44、比如對于一個請求,過濾器可能會執(zhí)行一次或五次,并無法知曉調(diào)用何時結(jié)束和先后順序。從一個read操作返回的eos代表請求的結(jié)束。過濾器也可能在子請求的遞歸調(diào)用中。為避免數(shù)據(jù)多次被改變,經(jīng)常的確保并不在子請求中,依靠req.main變量值。4.4連接(connection)處理器連接處理器處理連接到服務(wù)器的tcp連接。不同于http處理器,連接處理器接收connection對象做參數(shù)。連接處理器可以用于實現(xiàn)協(xié)議。如下例配置:pythonconnectionhandler echo實現(xiàn)文件echo.py:from mod_python import apachedef connectionhandl
45、er(conn):while 1:conn.write(conn.readline()return apache.ok4.5apache-訪問apache內(nèi)部apache內(nèi)部對python的接口也恰好叫做apache,在mod_python包。提供了連接apache內(nèi)部的重要功能,比如有用的函數(shù),文檔等(request對象也提供訪問apache內(nèi)部的接口,但不在本節(jié))。apache模塊僅可作為mod_python下的一個腳本來導(dǎo)入,因為它依賴于mod_python內(nèi)建的_apache模塊。最好按照如下導(dǎo)入:from mod_python import apachemod_python.apac
46、he模塊定義了如下函數(shù)和對象,更多深入的信息查看apache文檔。4.5.1函數(shù)log_error(message,level,server)apache函數(shù)ap_log_error()的接口,message是錯誤信息,level是如下值:aplog_emergaplog_alertaplog_critaplog_erraplog_warningaplog_noticeaplog_infoaplog_debugaplog_noerrnoserver是req.server對象的引用。如果沒有指定則寫入到缺省的日志,否則寫入到對應(yīng)虛擬服務(wù)器的日志中。當(dāng)server沒有指定時,日志級別也無效,日志級
47、別是httpd在編譯時指定的,經(jīng)常為warn。如果擁有請求對象的引用,最好用req.log_error,這樣將會存入請求相關(guān)信息,如源ip等。import_module(module_name,autoreload=1,log=0,path=none)mod_python的內(nèi)部高級特性,用于在模塊改變時自動重新載入模塊。module_name是模塊名,可以包含點的包名。autoreload標(biāo)志查看包是否有所改變,如果改變則自動重新載入。如果log為true則這個事件會記入日志。path嚴(yán)格指定模塊的位置。例子:from mod_python import apachemymodule=apac
48、he.import_module(mymodule,log=1)allow_methods(*args)用于設(shè)置req.allowed。req.allowed是多個標(biāo)志位的疊加,對應(yīng)allow:頭??梢栽诜祷豩ttp_not_implemented錯誤之前設(shè)置。參數(shù)如下:m_getm_putm_postm_deletem_connectm_optionsm_tracem_patchm_propfindm_proppatchm_mkcolm_copym_movem_lockm_unlockm_version_controlm_checkoutm_uncheckoutm_checkinm_upda
49、tem_labelm_reportm_mkworkspacem_mkactivitym_baseline_controlm_mergem_invalidexists_config_define(name)確定apache是否存在一個name配置。比如apache定義了-dfoobar則如下測試為真:apache.exists_config_define(foobar)register_cleanup(handler,data)注冊一個清除行為,等同于req.register_cleanup()或reg.server.register_cleanup(),除非服務(wù)器或請求對象不需要。config
50、_tree()返回服務(wù)器級(server-level)配置樹。這些配置不包含.htaccess文件的標(biāo)志。返回的是副本,修改對配置沒有效果。server_root()返回配置標(biāo)志serverroot的值。make_table()一個作廢的函數(shù),可用table代替。mpm_query(code)允許查詢mpm參數(shù)變量來處理線程。返回值是如下三種常量之一:ap_mpmq_not_supported=0指mpm支持線程或子進(jìn)程ap_mpmq_static=1指mpm正在使用靜態(tài)守護(hù)線程ap_mpmq_dynamic=2指mpm正在使用動態(tài)守護(hù)線程code參數(shù)是如下值:ap_mpmq_max_daem
51、on_used=1 最大允許使用的守護(hù)線程數(shù)量ap_mpmq_is_threaded=2 mpm是否允許使用線程ap_mpmq_is_forked=3 mpm是否可用fork生成子進(jìn)程ap_mpmq_hard_limit_daemons=4 編譯時允許的最大守護(hù)進(jìn)程數(shù)量ap_mpmq_hard_limit_threads=5 編譯時允許最大線程數(shù)量ap_mpmq_max_threads=6 threads/child配置允許的最大線程數(shù)量ap_mpmq_min_spare_daemons=7 最小剩余守護(hù)數(shù)ap_mpmq_min_spare_threads=8 最小剩余線程數(shù)ap_mpmq_m
52、ax_spare_daemons=9 最大剩余守護(hù)數(shù)ap_mpmq_max_spare_threads=10 最大剩余線程數(shù)ap_mpmq_max_requests_daemon=11每個守護(hù)最大允許請求數(shù)量ap_mpmq_max_daemons=12 配置允許的最大守護(hù)數(shù)量例如:if apache.mpm_query(apache.ap_mpmq_is_threaded):# do somethingelse:# do something else4.5.2表格對象(mp_table)class table(mapping-or-sequence)返回一個新的mp_table表格對象。map
53、ping-or-sequence提供了表格的初始化數(shù)據(jù)。表格對象是對apr表格對象的包裝(wrapper)。表格對象的行為(behave)非常像詞典(還支持python2.2以后的in操作符),但是有以下不同: 鍵和值都必須是字符串 鍵的查詢不區(qū)分大小寫 允許相同的鍵,即一個鍵對應(yīng)一個列表的值很多apache的信息存儲在表格中,如req.headers_in和req.headers_out。mod_python提供的所有表格對象都是真正(actual)映射(mapping)到apache結(jié)構(gòu)的,所以改變表格的值也會改變apache的表格。除了(in addition to)像詞典一樣的行為(b
54、ehavior)之外,表格對象還支持如下操作:add(key,val)這個方法允許使用相同的鍵,這對重復(fù)的頭很有用,比如set-cookie:就需要。這個功能從3.0開始提供。4.5.3請求對象請求對象是映射到apache的request_rec結(jié)構(gòu)的對象。當(dāng)處理器被調(diào)用時,會傳遞唯一個的一個參數(shù)就是請求對象??梢詾檎埱髮ο笾付▽傩?,用于在處理器之間通信。如下是方法:add_common_vars()間接調(diào)用ap_add_common_vars()函數(shù)。調(diào)用后,req.subprocess_env會包含大量的cgi信息。add_handler(htype,handler,dir)允許動態(tài)注冊處理器。htype是要添加的處理器的標(biāo)志,如pythonhandler,但不可以是過濾器(filter)或連接(connection)。handler是包含模塊名或函數(shù)名的處理器函數(shù)??蛇x參數(shù)dir是需要添加到pythonpath環(huán)境變量的路徑。如果未指定目錄,而且有同類
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計三層電梯
- 道勘課程設(shè)計范文
- 2025年度合同履行違約賠償合同4篇
- 二零二五年度門窗安裝與室外照明系統(tǒng)合同4篇
- 幼兒園墻面介紹課程設(shè)計
- 年度液壓件液力件市場分析及競爭策略分析報告
- 2025年度食堂環(huán)境衛(wèi)生管理承包服務(wù)合同4篇
- 2025年度企業(yè)間財務(wù)信息保密協(xié)議范本模板2篇
- 2025年度食堂承包商服務(wù)品質(zhì)提升協(xié)議4篇
- 2025年度農(nóng)業(yè)機械設(shè)備采購合同范本:農(nóng)機購置合作協(xié)議3篇
- 2024年萍鄉(xiāng)衛(wèi)生職業(yè)學(xué)院單招職業(yè)技能測試題庫標(biāo)準(zhǔn)卷
- DB32-T 4444-2023 單位消防安全管理規(guī)范
- 臨床三基考試題庫(附答案)
- 人員密集場所消防安全管理培訓(xùn)
- JCT587-2012 玻璃纖維纏繞增強熱固性樹脂耐腐蝕立式貯罐
- 員工信息登記表(標(biāo)準(zhǔn)版)
- 春節(jié)工地停工復(fù)工計劃安排( 共10篇)
- 新教材人教版高中物理選擇性必修第二冊全冊各章節(jié)課時練習(xí)題及章末測驗含答案解析(安培力洛倫茲力電磁感應(yīng)交變電流等)
- 初級養(yǎng)老護(hù)理員培訓(xùn)全套
- 危重病人搶救登記表
- GB/T 41095-2021機械振動選擇適當(dāng)?shù)臋C器振動標(biāo)準(zhǔn)的方法
評論
0/150
提交評論