日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

mod_python模块安装

發(fā)布時間:2025/3/15 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mod_python模块安装 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

兩、mod_python

1.性能
使用mod_python的主要優(yōu)勢在于比傳統(tǒng)CGI更高的性能 一個測試,使用在Pentium 1.2GHz的機器上執(zhí)行Red Hat Linux 7.3。使用4種類型的腳本。基于標準的CGI導入模塊(以典型的Python CGI腳本開始),然后輸出'Hello!',測試10000次請求作為基準。

標準CGI?23?次請求/

mod_python CGI處理器:?385?次請求/

mod_python?公布處理器:?476?次請求/

mod_python?處理器:?1203?次請求/




2.安裝
參考:http://galean.blog.51cto.com/7702012/1302140 http://wiki.woodpecker.org.cn/moin/modpythoncn
本文是參考以上兩個技術文檔,自己實際操作后的總結。


mod_python要與Apache協(xié)同工作
下載:http://modpython.org
[root@www local]# cd mod_python-3.3.1/?
[root@www mod_python-3.3.1]# ls?
configure CREDITS doc-html lib NEWS src?
configure.in dist examples LICENSE NOTICE test?
COPYRIGHT Doc install-sh Makefile.in README?
[root@www mod_python-3.3.1]# find / -name apxs?
/usr/sbin/apxs?
[root@www mod_python-3.3.1]# ./configure --with-apxs=/usr/sbin/apxs


出錯: configure: error: Can not link to python 解決: yum install python-devel


[root@www mod_python-3.3.1]# make

假設在編譯的過程中出現(xiàn)了例如以下錯誤:

connobject.c:142: error: request for member ?.ext?

.in something not a structure or union

apxs:Error: Command failed with rc=65536

make[1]: *** [mod_python.so] Error 1

make[1]: Leaving directory `/usr/local/src/mod_python-3.3.1/src'

make: *** [do_dso] Error 2

須要改動/mod_python-3.3.1/src/connobject.c這個文件。將當中的“!(b == APR_BRIGADE_SENTINEL(b) ”

改動為 “!(b == APR_BRIGADE_SENTINEL(bb)”


[root@www mod_python-3.3.1]# make install

[root@www mod_python-3.3.1]# find / -name mod_python.so?
/usr/lib/httpd/modules/mod_python.so?
/usr/local/mod_python-3.3.1/src/.libs/mod_python.so?
/usr/local/mod_python-3.3.1/src/mod_python.so?
[root@www mod_python-3.3.1]#?

然后檢查apache的modules文件夾是否存在mod_python.so庫。假設不存在,拷貝/usr/local/src/mod_python-3.3.1/src/mod_python.so到apache的modules文件夾。

并在httpd.conf中增加:

LoadModule python_module modules/mod_python.so




3.測試


配置httpd.conf文件


在httpd.conf中增加:

<Directory "/var/www/html/pyweb">

?AllowOverride FileInfo

?AddHandler mod_python .py

?PythonHandler index

?PythonDebug On

?Order allow,deny

?Allow from all

</Directory>




[root@www pyweb]# cat index.py ? 這里要是index.py才干正常顯示,由于?PythonHandler index 指定了模塊名
#!/usr/bin/python?
from mod_python import apache?
def handler(req):?
? ? req.content_type='text/plain'?

? ? req.write("Hello, world!")?
? ? return apache.OK?
[root@www pyweb]#?

(注意:PythonHandler index 。這里的名字index決定必須用index.py來測試)

解釋一下這個程序:


addHandler 指示告訴 apache, 全部在/var/www/html/pyweb?文件夾或者是它的子文件夾下的全部.py文件,有關于這些文件的不論什么請求都用mod_python 來處理,?PythonHandler index??指示告訴 mod_python 用?index??運行默認的處理器.?“pythonDebug On” 指示告訴mod_python假設錯誤發(fā)生。就把錯誤打印信息到client (相對于寫入日志文件),在開發(fā)的時候這個選項很實用。

當一個請求發(fā)出時,apache通過調用mod_python中的處理器分步處理請求,Mod_python首先檢查請求的那個處理器是否在配置文件里指定了(記住,它的角色是發(fā)報機dispatcher),在我們的樣例中,mod_python除了調用默認的那個處理器外不會調用其它的不論什么處理器,然后,mod_python會發(fā)現(xiàn)"PythonHandler index??"指示,并依照以下的步驟來進行:


1.假設曾經沒有做過。那么就把pythonHandler指定的那個文件夾加到sys.path中。

2.嘗試引入index??的模塊(注意,假設index?在pythonHandler指定那個文件夾的子文件夾中的話,引入會出錯,由于子文件夾并沒有加到sys.path中,解決這樣的情況的方法是使用包)比如:”pythonHandler subdir.index?”

3.在index?中尋找名字叫handler的方法。

4.調用這種方法,并把request對象傳遞給它。

5.如今讓我們深入這段腳本看一下:

from mod_python import apache

這個引入語句提供給我們一個訪問apache的接口。

除了極少數(shù)情況外,每個mod_python程序一般都會有這一行。

def handler(req):

這是處理器方法的聲明,它之所以叫"handler"是由于mod_python在指示中使用這個名字,轉換它為小寫并移除"python",所以"pythonHandler"變成了"handler",你能夠給它起別的名字,而且通過在指示中使用"::"明白的指定它.舉個樣例,假設處理器方法叫"spam",那么指示就應該是”pythonHandler myscript::spam”。

注意處理器必須有一個參數(shù)


request對象。Request對象提供了全部可能用到的信息。比方client的IP,頭,URI等等.返回client的信息仍然通過request對象傳遞。注意,在mod_python中沒有response對象。

req.content_type = "text/plain"

這條語句設置文檔類型為” text/plain”。默認的一般是” text/html”,可是由于我們的處理器不處理不論什么html, 所以“text/plain”更合適一些。

req.write("Hello World!")

這條語句把字符串” Hello World!”寫到client(再次強調沒有response對象,所以寫到client仍然有request對象)。

return apache.OK

這條語句告訴apache一切正常,并且請求也已經被處理了。假設出現(xiàn)異常,這一行應該返回apache.HTTP INTERNAL SERVER ERROR或返回apache.HTTP FORBIDDEN。并且apache會在日志中記錄這個錯誤。并產生一條錯誤信息給client。

一些提示:假設你細致閱讀的話,就會發(fā)現(xiàn)URI僅僅是指向了index.py這個文件,并沒有指定處理器代碼運行的順序,實際上僅僅要告訴處理器須要處理的是一個.py文件就能夠了。文件的名字并不重要,即使URL中指向的文件并不存在.所以,對于上面的配置。http://myserver/mywebdir/index.py?和?http://myserver/mywebdir/test.py?運行的結果是一樣的。






調試出現(xiàn)下面錯誤,原因是沒有縮進: IndentationError: expected an indented block
當我又一次創(chuàng)建一個test.py文件的時候,內容不同。可是結果顯示的內容卻是index.py的內容。

于是認為是config文件里?PythonHandler index的影響,去掉該行之后無法解析了。





配置.htaccess文件
在官方的說明中。.htaccess是站點的一個分布式配置文件,分布式顧名思義,就是能夠分布在各個不同的文件夾以下。每一個文件都有其不同的作用域。比方將文件放在“admin”文件夾下,那么這個配置文件僅僅對admin及其子文件夾下的文件生效。
沒有配置成功,增加下面內容沒有起到效果:
?AllowOverride FileInfo?
?AddHandler mod_python .py?
?PythonHandler index?
?PythonDebug On





為什么要使用mod_python模塊?????
其實,mod_python是在Apache Webserver中嵌入了具有所有功能的Python解釋器。這個模塊通常被用來強勁而高效地產生動態(tài)網頁,當然它另一些其它的用途。

編寫mod_python程序在非常多方面和編寫CGI程序類似。所以熟悉CGI(詳見第18章)會對您學習mod_python有非常大的幫助。

mod_python和CGI之間也有不同的地方。在本章中。我們也將介紹這些不同。 19.1??理解為什么須要mod_python 我們已經在第18章中討論過,CGI腳本是最經常使用的一種產生動態(tài)網頁的方法。每當有頁面請求的時候,相應的CGI腳本就被調用。它讀取請求,產生應答,并終于終止。這是仿效HTTP的操作,后者的核心是一次為一個單一的請求服務。

下一次又有請求的時候。CGI腳本會被又一次調用。這種設計就使CGI腳本具有語言和server中立的特性;并且其實,全部流行的Webserver和程序語言都支持CGI。

然而,這樣的兼容性是有代價的:那就是性能。

啟動一個CGI腳本非常慢,操作系統(tǒng)須要為它建立新進程。Python解釋器須要初始化和加載腳本。對于連接數(shù)據(jù)庫的CGI腳本來說,性能就更差了,由于每次顯示一個頁面的時候,它們都必須建立一個新的數(shù)據(jù)庫session。正是由于這個原因。CGI腳本不適合那些流量大的網站。 mod_python就是一個解決問題的方法。它實際上在Apache Webserver中嵌入了一個完整的Python解釋器。

CGI腳本僅僅在server進程初始化的時候加載一次。

數(shù)據(jù)庫連接也能夠在Webserver初始化的時候建立,并保持連接直到Webserver關閉。每當要產生一個頁面的時候,一個特殊的函數(shù)就被調用,全部關于請求的數(shù)據(jù)都被傳入該函數(shù)。

這個函數(shù)有權訪問Webserver初始化時建立的環(huán)境變量。比如,它能夠反復使用已經存在的數(shù)據(jù)庫連接。 雖然這樣的方法必須使用Apacheserver,可是它的長處要比缺點多得多,尤其是當您從頭開始設計一個完整的Web應用的時候。

Python能夠作為那些專門開發(fā)Web應用語言的替代者。比如PHP。 其實,mod_python除了用在提供頁面之外還能夠做其它的事情。它還能夠在多個方面和Apache系統(tǒng)結合。比如:Apache提供了多種認證的處理方法。這些方法能夠使您依據(jù)一個包括username和password的文本文件或LDAP數(shù)據(jù)庫來認證用戶。

您能夠使用mod_python來編寫您自己的認證處理程序(也許它通過一個遠程XML-RPCserver來驗證),并隨時在Apache中使用這個程序——即使是那些不是由Python代碼產生的頁面。






4.使用公布器(Publisher)的高速樣例

公布器(publisher)提供了公布mod_python標準模塊的方式。須要在配置文件里增加例如以下配置:

[root@www pyweb]# tail -7 /etc/httpd/conf/httpd.conf

<Directory "/var/www/html/pyweb/">?
? ? ? ? AddHandler mod_python .py?
? ? ? ? PythonHandler mod_python.publisher?
? ? ? ? PythonDebug On?
</Directory>?


經測試發(fā)現(xiàn)能夠同一時候多個?PythonHandler處理器一起使用。僅僅是結果都會出如今同一頁面。例如以下便是publisher和index測試同一時候配置了PythonHandler的結果




簡單舉例: 接下來的這個樣例展示了一個簡單的返回表單,這個表單詢問用戶的名稱,電子郵箱,地址和意見,然后發(fā)送一封電子郵件給網絡管理員,信的內容就是用戶填寫的意見。這個簡單的程序包含兩個文件:form.html---用來收集數(shù)據(jù)。form.py---表單的action指令發(fā)送的目標。


[root@www pyweb]# cat form.html? <html>
? ?請?zhí)顚懸韵碌幕仞伇韱?
? ?<form action="form.py/email" method="POST">
? ? ? ? ? username: <input type="text" name="name"><br>
? ? ? ? ? 電子郵件: <input type="text" name="email"><br>
? ? ? ? ? 意見: <textarea name="comment" rows=4 cols=20></textarea><br>
? ? ? ? ? ? ? ? ? ? <input type="submit">
? ? ?</form>
</html>


[root@www pyweb]# cat form.py #!/usr/bin/python
#-*- coding: UTF-8 -*-
import smtplib
from mod_python import apache
WEBMASTER = "webmaster" ? ? ? ?# webmaster e-mail
SMTP_SERVER = "localhost" ? ? ?# your SMTP server
def email(req, name, email, comment):
? ? ?#確定用戶提供了全部的參數(shù)
? ? if not (name and email and comment):
? ? ? ? return "A required parameter is missing,please go back and correct the error"
? ? ? ? ? ? # 創(chuàng)建消息對話框
? ? msg = """\
? ? ? ? ? ?From: %s
? ? ? ? ? ?Subject: feedback
? ? ? ? ? ?To: %s
? ? ? ? ? ?I have the following comment:
? ? ? ? ? ?%s
? ? ? ? ? ? ? Thank You,
? ? ? ? ? ?%s
? ? """ % (email, WEBMASTER, comment, name)
? ? #發(fā)出信件
? ??conn = smtplib.SMTP(SMTP_SERVER)
? ? conn.sendmail(email, [WEBMASTER], msg)
? ? conn.quit()

? ? # 返回用戶信息
? ? s = """\
? ? ? ?<html>
? ? ? ?親愛的%s,<br>
? ? ? ?謝謝你的意見,我們會在最近與你聯(lián)系.
? ? ? ?</html>
? ? """ % name
? ? return s


[root@www pyweb]# cat?/var/spool/mail/root From 171285755@qq.com Tue Jun 17 14:29:18 2014
Return-Path: <171285755@qq.com>
X-Original-To: webmaster
Delivered-To: webmaster@www.tqy.com
Received: from www.tqy.com (localhost [IPv6:::1])
? ? ? ? by www.tqy.com (Postfix) with ESMTP id 292EE1617
? ? ? ? for <webmaster>; Tue, 17 Jun 2014 14:29:18 +0800 (CST)
Message-Id: <20140617062918.292EE1617@www.tqy.com>
Date: Tue, 17 Jun 2014 14:29:18 +0800 (CST)
From: 171285755@qq.com
To: undisclosed-recipients:;
? ? ? ? ? ?From: 171285755@qq.com
? ? ? ? ? ?Subject: feedback
? ? ? ? ? ?To: webmaster
? ? ? ? ? ?I have the following comment:
? ? ? ? ? ?試試
? ? ? ? ? ? ? Thank You,
? ? ? ? ? ?tqy-test



當用戶點擊確定button的時候。公布處理器就會調用form模塊中的email方法,把表單中各個域的值做為email方法的參數(shù)傳遞給email方法,而且也會把request的對象req一并傳遞過去。


并非非要把req做為email方法的一個參數(shù)不可。假設你不須要它,能夠省略掉。

公布處理器非常靈活,它僅僅會把那些在方法的參數(shù)列表中存在參數(shù)所相相應的域的值傳遞過去。
方法的返回值在瀏覽器中顯示出來。


盡管公布處理器極大的簡化了mod_python編程。可是mod_python所具有的強大功能卻沒有損失,由于公布處理器能夠訪問到request對象,所以你能夠做到與原生(native)mod_python處理器全然同樣的事情。?舉例來說:
通過req.headers能夠自己定義頭(header),通過拋出apache.SERVERERROR返回異常,通過req.write()和req.read()直接讀寫client等等。






錯誤:SyntaxError:?Non-ASCII?character?'\xe7'?in?file?


出現(xiàn)這樣的錯誤的原因是程序中的編碼出問題了。僅僅要在程序的最前面加上

?

#-*-?coding:?UTF-8?-*-?

?又一次保存就可以



5.認證

如果我們想用password保護一個文件夾,用名字:spam,password:eggs來登陸。

首先,我們須要告訴apache當須要認證的時候去調用我們的認證處理器。我們通過在配置文件里增加pythonAuthenHandler來實現(xiàn),例如以下:


[root@www pyweb]# tail -11 /etc/httpd/conf/httpd.conf <Directory "/var/www/html/pyweb/">?
? ? ? ? AddHandler mod_python .py?
? ? ? ? #PythonHandler mod_python.publisher ? #加上該句則輸入username和password之后報錯無法找到myscript.py文件
? ? ? ? PythonHandler myscript ? ? ? ? ? ? ? ?#我們在這里為兩個不同的處理器指定了同樣的腳本。這是能夠的?
? ? ? ??PythonAuthenHandler?myscript?
? ? ? ? PythonDebug On?
? ? ? ? AuthType Basic?
? ? ? ? AuthName "Restricted Area"?
? ? ? ? require valid-user?
</Directory>?
[root@www pyweb]#


[root@www pyweb]# cat myscript.py?? #!/usr/bin/python?
from mod_python import apache?
def authenhandler(req): ? ? ? ? ? ? ? ? ? ? ?#處理器方法的聲明?
? ? req.content_type='text/plain'?
? ? pw = req.get_basic_auth_pw()?
? ? user = req.user?
? ? if user == "spam" and pw == "eggs":?
? ? ? ? return apache.OK?
? ? else:?
? ? ? ? return apache.HTTP_UNAUTHORIZED?
def handler(req):?
? ? req.content_type='text/html'?
? ? req.write("Hello, world!---test")?
? ? return apache.OK?
[root@www pyweb]#?

運行authenhandler成功則會繼續(xù)運行下面handler內容,否則會返回錯誤信息。


authenhandler(req)
為什么這種方法的名字叫authenhandler呢?mod_python把配置文件里的指示的名稱(pythonAuthenHandler)去掉"python",然后把剩下的單詞所有變成小寫,因此就是authenhandler了。


pw = req.get_basic_auth_pw()

我們通過這一句代碼得到password。http在傳輸驗證password的時候一般以base64的編碼進行傳輸,這種方法把它解析成字符串。



其它處理程序:
CGI處理程序所需配置 SetHandler mod_python PythonHandler mod_python.cgihandler
apache配置支持PSP AddHandler mod_python .psp PythonHandler mod_python.psp


6.psp處理程序
html和python代碼的混合使用 psp處理程序用<%%>包含
[root@www psp]# vi index.psp <%
from random import choice
adjectives = ['beatiful','cruel']
%>
<html>
? ?<head>
? ? ?<title>hello</title>
? ?</head>
? ? ? ? <body>
? ? ? ? <p>hello.<%=choice(adjectives)%> girl. my name is ***</p>
? ? ? ? </body>
</html>
A <%
for i in range(3):
? %>
? merry.
<%
%>

merry christamas time.?

結果顯示:

hello.beatiful girl. my name is ***

A merry. merry. merry. merry christamas time.

<%?%>空的用來終止該for塊。不然以下的信息也會輸出三次 二、mod_python

1.性能
使用mod_python的主要優(yōu)勢在于比傳統(tǒng)CGI更高的性能

一個測試。使用在Pentium 1.2GHz的機器上執(zhí)行Red Hat Linux 7.3。使用4種類型的腳本,基于標準的CGI導入模塊(以典型的Python CGI腳本開始)。然后輸出'Hello!',測試10000次請求作為基準。


標準CGI?23?次請求/

mod_python CGI處理器:?385?次請求/

mod_python?公布處理器:?476?次請求/

mod_python?處理器:?1203?次請求/




2.安裝
參考:http://galean.blog.51cto.com/7702012/1302140 http://wiki.woodpecker.org.cn/moin/modpythoncn
本文是參考以上兩個技術文檔,自己實際操作后的總結。


mod_python要與Apache協(xié)同工作
下載:http://modpython.org
[root@www local]# cd mod_python-3.3.1/?
[root@www mod_python-3.3.1]# ls?
configure CREDITS doc-html lib NEWS src?
configure.in dist examples LICENSE NOTICE test?
COPYRIGHT Doc install-sh Makefile.in README?
[root@www mod_python-3.3.1]# find / -name apxs?
/usr/sbin/apxs?
[root@www mod_python-3.3.1]# ./configure --with-apxs=/usr/sbin/apxs


出錯: configure: error: Can not link to python 解決: yum install python-devel


[root@www mod_python-3.3.1]# make

假設在編譯的過程中出現(xiàn)了例如以下錯誤:

connobject.c:142: error: request for member ?.ext?.in something not a structure or union

apxs:Error: Command failed with rc=65536

make[1]: *** [mod_python.so] Error 1

make[1]: Leaving directory `/usr/local/src/mod_python-3.3.1/src'

make: *** [do_dso] Error 2

須要改動/mod_python-3.3.1/src/connobject.c這個文件。將當中的“!(b == APR_BRIGADE_SENTINEL(b) ”

改動為 “!(b == APR_BRIGADE_SENTINEL(bb)”


[root@www mod_python-3.3.1]# make install

[root@www mod_python-3.3.1]# find / -name mod_python.so?
/usr/lib/httpd/modules/mod_python.so?
/usr/local/mod_python-3.3.1/src/.libs/mod_python.so?
/usr/local/mod_python-3.3.1/src/mod_python.so?
[root@www mod_python-3.3.1]#?

然后檢查apache的modules文件夾是否存在mod_python.so庫。假設不存在。拷貝/usr/local/src/mod_python-3.3.1/src/mod_python.so到apache的modules文件夾。

并在httpd.conf中增加:

LoadModule python_module modules/mod_python.so




3.測試


配置httpd.conf文件


在httpd.conf中增加:

<Directory "/var/www/html/pyweb">

?AllowOverride FileInfo

?AddHandler mod_python .py

?PythonHandler index

?PythonDebug On

?Order allow,deny

?Allow from all

</Directory>




[root@www pyweb]# cat index.py ? 這里要是index.py才干正常顯示,由于?PythonHandler index 指定了模塊名
#!/usr/bin/python?
from mod_python import apache?
def handler(req):?
? ? req.content_type='text/plain'?

? ? req.write("Hello, world!")?
? ? return apache.OK?
[root@www pyweb]#?

(注意:PythonHandler index ,這里的名字index決定必須用index.py來測試)

解釋一下這個程序:


addHandler 指示告訴 apache, 全部在/var/www/html/pyweb?文件夾或者是它的子文件夾下的全部.py文件,有關于這些文件的不論什么請求都用mod_python 來處理,?PythonHandler index??指示告訴 mod_python 用?index??運行默認的處理器.?“pythonDebug On” 指示告訴mod_python假設錯誤發(fā)生。就把錯誤打印信息到client (相對于寫入日志文件),在開發(fā)的時候這個選項很實用。

當一個請求發(fā)出時,apache通過調用mod_python中的處理器分步處理請求,Mod_python首先檢查請求的那個處理器是否在配置文件里指定了(記住。它的角色是發(fā)報機dispatcher),在我們的樣例中,mod_python除了調用默認的那個處理器外不會調用其它的不論什么處理器,然后,mod_python會發(fā)現(xiàn)"PythonHandler index??"指示,并依照以下的步驟來進行:


1.假設曾經沒有做過,那么就把pythonHandler指定的那個文件夾加到sys.path中。

2.嘗試引入index??的模塊(注意,假設index?在pythonHandler指定那個文件夾的子文件夾中的話,引入會出錯,由于子文件夾并沒有加到sys.path中,解決這樣的情況的方法是使用包)比如:”pythonHandler subdir.index?”

3.在index?中尋找名字叫handler的方法。

4.調用這種方法,并把request對象傳遞給它。

5.如今讓我們深入這段腳本看一下:

from mod_python import apache

這個引入語句提供給我們一個訪問apache的接口。除了極少數(shù)情況外,每個mod_python程序一般都會有這一行。

def handler(req):

這是處理器方法的聲明,它之所以叫"handler"是由于mod_python在指示中使用這個名字,轉換它為小寫并移除"python",所以"pythonHandler"變成了"handler",你能夠給它起別的名字。而且通過在指示中使用"::"明白的指定它.舉個樣例,假設處理器方法叫"spam",那么指示就應該是”pythonHandler myscript::spam”。

注意處理器必須有一個參數(shù)


request對象。Request對象提供了全部可能用到的信息,比方client的IP,頭,URI等等.返回client的信息仍然通過request對象傳遞,注意。在mod_python中沒有response對象。

req.content_type = "text/plain"

這條語句設置文檔類型為” text/plain”。

默認的一般是” text/html”,可是由于我們的處理器不處理不論什么html, 所以“text/plain”更合適一些。

req.write("Hello World!")

這條語句把字符串” Hello World!”寫到client(再次強調沒有response對象,所以寫到client仍然有request對象)。

return apache.OK

這條語句告訴apache一切正常,并且請求也已經被處理了。

假設出現(xiàn)異常,這一行應該返回apache.HTTP INTERNAL SERVER ERROR或返回apache.HTTP FORBIDDEN。并且apache會在日志中記錄這個錯誤,并產生一條錯誤信息給client。

一些提示:假設你細致閱讀的話。就會發(fā)現(xiàn)URI僅僅是指向了index.py這個文件,并沒有指定處理器代碼運行的順序,實際上僅僅要告訴處理器須要處理的是一個.py文件就能夠了,文件的名字并不重要,即使URL中指向的文件并不存在.所以,對于上面的配置,http://myserver/mywebdir/index.py?和?http://myserver/mywebdir/test.py?運行的結果是一樣的。






調試出現(xiàn)下面錯誤,原因是沒有縮進: IndentationError: expected an indented block
當我又一次創(chuàng)建一個test.py文件的時候,內容不同。可是結果顯示的內容卻是index.py的內容。

于是認為是config文件里?PythonHandler index的影響,去掉該行之后無法解析了。




配置.htaccess文件
在官方的說明中,.htaccess是站點的一個分布式配置文件,分布式顧名思義,就是能夠分布在各個不同的文件夾以下,每一個文件都有其不同的作用域。比方將文件放在“admin”文件夾下,那么這個配置文件僅僅對admin及其子文件夾下的文件生效。


沒有配置成功,增加下面內容沒有起到效果:
?AllowOverride FileInfo?
?AddHandler mod_python .py?
?PythonHandler index?
?PythonDebug On





為什么要使用mod_python模塊?????
其實。mod_python是在Apache Webserver中嵌入了具有所有功能的Python解釋器。這個模塊通常被用來強勁而高效地產生動態(tài)網頁。當然它另一些其它的用途。 編寫mod_python程序在非常多方面和編寫CGI程序類似。所以熟悉CGI(詳見第18章)會對您學習mod_python有非常大的幫助。mod_python和CGI之間也有不同的地方,在本章中,我們也將介紹這些不同。 19.1??理解為什么須要mod_python 我們已經在第18章中討論過。CGI腳本是最經常使用的一種產生動態(tài)網頁的方法。每當有頁面請求的時候,相應的CGI腳本就被調用。

它讀取請求,產生應答,并終于終止。這是仿效HTTP的操作,后者的核心是一次為一個單一的請求服務。下一次又有請求的時候,CGI腳本會被又一次調用。這種設計就使CGI腳本具有語言和server中立的特性;并且其實,全部流行的Webserver和程序語言都支持CGI。

然而。這樣的兼容性是有代價的:那就是性能。啟動一個CGI腳本非常慢,操作系統(tǒng)須要為它建立新進程。Python解釋器須要初始化和加載腳本。對于連接數(shù)據(jù)庫的CGI腳本來說。性能就更差了,由于每次顯示一個頁面的時候,它們都必須建立一個新的數(shù)據(jù)庫session。正是由于這個原因,CGI腳本不適合那些流量大的網站。 mod_python就是一個解決問題的方法。它實際上在Apache Webserver中嵌入了一個完整的Python解釋器。CGI腳本僅僅在server進程初始化的時候加載一次。數(shù)據(jù)庫連接也能夠在Webserver初始化的時候建立,并保持連接直到Webserver關閉。

每當要產生一個頁面的時候。一個特殊的函數(shù)就被調用,全部關于請求的數(shù)據(jù)都被傳入該函數(shù)。這個函數(shù)有權訪問Webserver初始化時建立的環(huán)境變量。比如。它能夠反復使用已經存在的數(shù)據(jù)庫連接。 雖然這樣的方法必須使用Apacheserver,可是它的長處要比缺點多得多,尤其是當您從頭開始設計一個完整的Web應用的時候。Python能夠作為那些專門開發(fā)Web應用語言的替代者。比如PHP。 其實,mod_python除了用在提供頁面之外還能夠做其它的事情。

它還能夠在多個方面和Apache系統(tǒng)結合。比如:Apache提供了多種認證的處理方法。這些方法能夠使您依據(jù)一個包括username和password的文本文件或LDAP數(shù)據(jù)庫來認證用戶。

您能夠使用mod_python來編寫您自己的認證處理程序(也許它通過一個遠程XML-RPCserver來驗證),并隨時在Apache中使用這個程序——即使是那些不是由Python代碼產生的頁面。






4.使用公布器(Publisher)的高速樣例

公布器(publisher)提供了公布mod_python標準模塊的方式。

須要在配置文件里增加例如以下配置:

[root@www pyweb]# tail -7 /etc/httpd/conf/httpd.conf

<Directory "/var/www/html/pyweb/">?
? ? ? ? AddHandler mod_python .py?
? ? ? ? PythonHandler mod_python.publisher?
? ? ? ? PythonDebug On?
</Directory>?


經測試發(fā)現(xiàn)能夠同一時候多個?PythonHandler處理器一起使用。僅僅是結果都會出如今同一頁面。例如以下便是publisher和index測試同一時候配置了PythonHandler的結果



簡單舉例: 接下來的這個樣例展示了一個簡單的返回表單。這個表單詢問用戶的名稱,電子郵箱,地址和意見,然后發(fā)送一封電子郵件給網絡管理員,信的內容就是用戶填寫的意見。這個簡單的程序包含兩個文件:form.html---用來收集數(shù)據(jù),form.py---表單的action指令發(fā)送的目標。


[root@www pyweb]# cat form.html? <html>
? ?請?zhí)顚懸韵碌幕仞伇韱?
? ?<form action="form.py/email" method="POST">
? ? ? ? ? username: <input type="text" name="name"><br>
? ? ? ? ? 電子郵件: <input type="text" name="email"><br>
? ? ? ? ? 意見: <textarea name="comment" rows=4 cols=20></textarea><br>
? ? ? ? ? ? ? ? ? ? <input type="submit">
? ? ?</form>
</html>


[root@www pyweb]# cat form.py #!/usr/bin/python
#-*- coding: UTF-8 -*-
import smtplib
from mod_python import apache
WEBMASTER = "webmaster" ? ? ? ?# webmaster e-mail
SMTP_SERVER = "localhost" ? ? ?# your SMTP server
def email(req, name, email, comment):
? ? ?#確定用戶提供了全部的參數(shù)
? ? if not (name and email and comment):
? ? ? ? return "A required parameter is missing,please go back and correct the error"
? ? ? ? ? ? # 創(chuàng)建消息對話框
? ? msg = """\
? ? ? ? ? ?From: %s
? ? ? ? ? ?Subject: feedback
? ? ? ? ? ?To: %s
? ? ? ? ? ?I have the following comment:
? ? ? ? ? ?%s
? ? ? ? ? ? ? Thank You,
? ? ? ? ? ?%s
? ? """ % (email, WEBMASTER, comment, name)
? ? #發(fā)出信件
? ??conn = smtplib.SMTP(SMTP_SERVER)
? ? conn.sendmail(email, [WEBMASTER], msg)
? ? conn.quit()

? ? # 返回用戶信息
? ? s = """\
? ? ? ?<html>
? ? ? ?親愛的%s,<br>
? ? ? ?謝謝你的意見,我們會在最近與你聯(lián)系.
? ? ? ?</html>
? ? """ % name
? ? return s


[root@www pyweb]# cat?/var/spool/mail/root From 171285755@qq.com Tue Jun 17 14:29:18 2014
Return-Path: <171285755@qq.com>
X-Original-To: webmaster
Delivered-To: webmaster@www.tqy.com
Received: from www.tqy.com (localhost [IPv6:::1])
? ? ? ? by www.tqy.com (Postfix) with ESMTP id 292EE1617
? ? ? ? for <webmaster>; Tue, 17 Jun 2014 14:29:18 +0800 (CST)
Message-Id: <20140617062918.292EE1617@www.tqy.com>
Date: Tue, 17 Jun 2014 14:29:18 +0800 (CST)
From: 171285755@qq.com
To: undisclosed-recipients:;
? ? ? ? ? ?From: 171285755@qq.com
? ? ? ? ? ?Subject: feedback
? ? ? ? ? ?To: webmaster
? ? ? ? ? ?I have the following comment:
? ? ? ? ? ?試試
? ? ? ? ? ? ? Thank You,
? ? ? ? ? ?tqy-test



當用戶點擊確定button的時候。公布處理器就會調用form模塊中的email方法。把表單中各個域的值做為email方法的參數(shù)傳遞給email方法,而且也會把request的對象req一并傳遞過去。


并非非要把req做為email方法的一個參數(shù)不可。假設你不須要它,能夠省略掉。公布處理器非常靈活。它僅僅會把那些在方法的參數(shù)列表中存在參數(shù)所相相應的域的值傳遞過去。
方法的返回值在瀏覽器中顯示出來。


盡管公布處理器極大的簡化了mod_python編程。可是mod_python所具有的強大功能卻沒有損失,由于公布處理器能夠訪問到request對象,所以你能夠做到與原生(native)mod_python處理器全然同樣的事情。

?舉例來說:
通過req.headers能夠自己定義頭(header)。通過拋出apache.SERVERERROR返回異常,通過req.write()和req.read()直接讀寫client等等。






錯誤:SyntaxError:?Non-ASCII?character?'\xe7'?in?file?


出現(xiàn)這樣的錯誤的原因是程序中的編碼出問題了。僅僅要在程序的最前面加上

?

#-*-?coding:?UTF-8?-*-?

?又一次保存就可以



5.認證

如果我們想用password保護一個文件夾,用名字:spam,password:eggs來登陸。

首先,我們須要告訴apache當須要認證的時候去調用我們的認證處理器。我們通過在配置文件里增加pythonAuthenHandler來實現(xiàn),例如以下:


[root@www pyweb]# tail -11 /etc/httpd/conf/httpd.conf <Directory "/var/www/html/pyweb/">?
? ? ? ? AddHandler mod_python .py?
? ? ? ? #PythonHandler mod_python.publisher ? #加上該句則輸入username和password之后報錯無法找到myscript.py文件
? ? ? ? PythonHandler myscript ? ? ? ? ? ? ? ?#我們在這里為兩個不同的處理器指定了同樣的腳本,這是能夠的?
? ? ? ??PythonAuthenHandler?myscript?
? ? ? ? PythonDebug On?
? ? ? ? AuthType Basic?
? ? ? ? AuthName "Restricted Area"?
? ? ? ? require valid-user?
</Directory>?
[root@www pyweb]#


[root@www pyweb]# cat myscript.py?? #!/usr/bin/python?
from mod_python import apache?
def authenhandler(req): ? ? ? ? ? ? ? ? ? ? ?#處理器方法的聲明?
? ? req.content_type='text/plain'?
? ? pw = req.get_basic_auth_pw()?
? ? user = req.user?
? ? if user == "spam" and pw == "eggs":?
? ? ? ? return apache.OK?
? ? else:?
? ? ? ? return apache.HTTP_UNAUTHORIZED?
def handler(req):?
? ? req.content_type='text/html'?
? ? req.write("Hello, world!---test")?
? ? return apache.OK?
[root@www pyweb]#?

運行authenhandler成功則會繼續(xù)運行下面handler內容。否則會返回錯誤信息。


authenhandler(req)
為什么這種方法的名字叫authenhandler呢?mod_python把配置文件里的指示的名稱(pythonAuthenHandler)去掉"python",然后把剩下的單詞所有變成小寫,因此就是authenhandler了。
pw = req.get_basic_auth_pw()

我們通過這一句代碼得到password。

http在傳輸驗證password的時候一般以base64的編碼進行傳輸,這種方法把它解析成字符串。



其它處理程序:
CGI處理程序所需配置 SetHandler mod_python PythonHandler mod_python.cgihandler
apache配置支持PSP AddHandler mod_python .psp PythonHandler mod_python.psp


6.psp處理程序
html和python代碼的混合使用 psp處理程序用<%%>包含
[root@www psp]# vi index.psp <%
from random import choice
adjectives = ['beatiful','cruel']
%>
<html>
? ?<head>
? ? ?<title>hello</title>
? ?</head>
? ? ? ? <body>
? ? ? ? <p>hello.<%=choice(adjectives)%> girl. my name is ***</p>
? ? ? ? </body>
</html>
A <%
for i in range(3):
? %>
? merry.
<%
%>

merry christamas time.?

結果顯示:

hello.beatiful girl. my name is ***

A merry. merry. merry. merry christamas time.

<%?%>空的用來終止該for一片,否則,以下信息也被輸出三次

版權聲明:本文博主原創(chuàng)文章,博客,未經同意不得轉載。

總結

以上是生活随笔為你收集整理的mod_python模块安装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。