apache是分步驟處理請求的,例如,第一步可能是確定用戶,接下來驗證用戶是不是允許訪問特定的文件,然後讀這個文件並把它發送到客戶端。
一個典型的靜態文件請求包括三步:
- (1)解析請求的URI爲文件在服務器上的路徑。
- (2)讀文件並把它發送到客戶端。
- (3)記錄請求日誌。這個日誌中記錄了執行的步驟,記錄內容的多少取決於配置文件中的設置。
一個處理器就是處理其中某一步的方法,有可能在處理某一步的時候需要用到不止一個處理器,在這種情況下,這幾個處理器將被apache依次調用。每一步都會有一個默認的apache動作(大多數情況下都是很基礎的方法或者不做任何事情)。與此同時,apache模塊還提供了附加的處理器,比如mod_python.
mod_python爲apache提供了幾乎所有需要用到的處理器,mod_python的處理器默認的不會提供任何方法,除非我們明確的在配置文件中指示。這些指示以"python"開始,以"Handler"結束(比如: pythonAuthenHandler )它對應於一個python方法,這個方法處理衆多步驟中的一步。所以mod_python的方法扮演的是發報機(dispatcher)的角色,通過它聯繫apache動作和開發人員(比如你)寫的python方法。
最經常用到的處理器是 pythonHandler,它處理那些請求提供內容的步驟。因爲它沒有名字,所以有時候它被作爲泛指的處理器。這個處理器的默認的apache動作是讀文件並把它發送的客戶端。你寫的大多數程序都會重載這個處理器。
假設我們有下面的配置文件:
AddHandler mod_python .py
PythonHandler myscript
PythonDebug On
</Directory>
注意: /mywebdir 是一個物理絕對路徑。 還有一個python程序‘/mywedir/myscript.py’如下:
def handler(req):
req.content_type = "text/plain"
req.write("Hello World!")
return apache.OK
解釋一下這個程序:
addHandler 指示告訴 apache, 所有在mywebdir目錄或者是它的子目錄下的所有.py文件,有關於這些文件的任何請求都用mod_python 來處理, pythonHandler myscript 指示告訴 mod_python 用 myscript 執行默認的處理器. “pythonDebug On” 指示告訴mod_python如果發生錯誤,就把錯誤信息打印到客戶端 (相對於寫入日誌文件),在開發的時候這個選項非常有用。
當一個請求發出時,apache通過調用mod_python中的處理器分步處理請求,Mod_python首先檢查請求的那個處理器是否在配置文件中指定了(記住,它的角色是發報機dispatcher),在我們的例子中,mod_python除了調用默認的那個處理器外不會調用其他的任何處理器,然後,mod_python會發現"pythonHandler myscript"指示,並按照下面的步驟來進行:
- 1.如果以前沒有做過,那麼就把pythonHandler指定的那個目錄加到sys.path中。
- 2.嘗試引入myscript的模塊(注意,如果myscript在pythonHandler指定那個目錄的子目錄中的話,引入會出錯,因爲子目錄並沒有加到sys.path中,解決這種情況的方法是使用包)例如:”pythonHandler subdir.myscript”
- 3.在myscript中尋找名字叫handler的方法。
- 4.調用這個方法,並把request對象傳遞給它。
- 5.現在讓我們深入這段腳本看一下:
from mod_python import apachedef handler(req):
注意處理器必須有一個參數request對象。Request對象提供了所有可能用到的信息,比如客戶端的IP,頭,URI等等.返回客戶端的信息仍然通過request對象傳遞,注意,在mod_python中沒有response對象。req.content_type = "text/plain"req.write("Hello World!")return apache.OK