[Python]Apache with Mod_python

 

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動作是讀文件並把它發送的客戶端。你寫的大多數程序都會重載這個處理器。

假設我們有下面的配置文件:

    <Directory /mywebdir>
       AddHandler mod_python .py
       PythonHandler myscript
       PythonDebug On
    
</Directory>

注意: /mywebdir 是一個物理絕對路徑。 還有一個python程序‘/mywedir/myscript.py’如下:

from mod_python import apache
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 apache 
    這個引入語句提供給我們一個訪問apache的接口。除了極少數情況外,每一個mod_python程序一般都會有這一行。
    def handler(req): 
    這是處理器方法的聲明,它之所以叫"handler"是因爲mod_python在指示中使用這個名字,轉換它爲小寫並移除"python",所以"pythonHandler"變成了"handler",你可以給它起別的名字,並且通過在指示中使用"::"明確的指定它.舉個例子,如果處理器方法叫"spam",那麼指示就應該是”pythonHandler myscript::spam”。
    注意處理器必須有一個參數request對象。Request對象提供了所有可能用到的信息,比如客戶端的IP,頭,URI等等.返回客戶端的信息仍然通過request對象傳遞,注意,在mod_python中沒有response對象。
    req.content_type = "text/plain" 
    這條語句設置文檔類型爲” text/plain”。默認的通常是” text/html”,但是因爲我們的處理器不處理任何html, 所以“text/plain”更合適一些。
    req.write("Hello World!"
    這條語句把字符串” Hello World!”寫到客戶端(再次強調沒有response對象,所以寫到客戶端仍然有request對象)。
    return apache.OK 
    這條語句告訴apache一切正常,而且請求也已經被處理了。如果出現異常,這一行應該返回apache.HTTP INTERNAL SERVER ERROR或返回apache.HTTP FORBIDDEN,而且apache會在日誌中記錄這個錯誤,併產生一條錯誤信息給客戶端。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章