摘要:最近添加的功能是通過表單上傳文件。腳本的輸出由兩部分組成,由一個空行分割。后者接受重復鍵值二進制文件等。方法會返回所有為的值。進行類型檢查是必須的,因為會有好事的用戶,輸入重復的鍵名。
cgi 通用網關接口 前驅知識
網關協議學習:CGI、FastCGI、WSGI
簡單點說:
web服務器接受請求,啟動CGI;CGI接受請求,處理,返回給服務器;服務器返回給用戶
cgi效率不高,每次都要fork一個新進程出來
WCGI,Python架設的一個橋,連接了服務器和web框架,相當將cgi的連接功能獨立了出來,并把處理功能留給了web框架
簡介CGI腳本由HTTP服務器啟動,通常用來處理用戶通過
通常,CGI腳本位于服務器的專門的cgi-bin目錄下。HTTP服務器在腳本的shell環境中放置了請求相關的信息,比如客戶端的hostname,請求的url,請求的字符串以及其他東西。服務器執行腳本,并把輸出返回給客戶端。
腳本的輸入也和客戶端相連,有時表單數據是通過這種方式讀取的。其他時候,表單數據是通過URL的query字符串傳遞的。這個模塊用于處理不同的情況,提供一個簡單的接口。同時提供了一些功能,幫助調試腳本。最近添加的功能是通過表單上傳文件。
CGI腳本的輸出由兩部分組成,由一個空行分割。第一部分包含一些頭部,告訴客戶接下來返回的是什么數據。大概是這樣:
print("Content-Type: text/html") # 接下來返回的是html print() # 空白行,頭部結束
第二部分,一般來說是HTML。客戶端軟件可以展示這些頁面,圖片什么的。
使用cgi模塊當你寫一個新的腳本時,添加下面這兩行:
import cgitb cigtb.enable()
這將會激活一個異常處理器,如果發生了錯誤,它就會把錯誤返回給瀏覽器。如果你不想讓用戶看到,也可以指定輸出目錄。
import cgitb cgitb.enable(display=0, logdir="/path/to/logdir")
補充:
POST請求提交數據有兩種方式application/x-www-form-urlencoded和multipart/form-data。前者形如MyVariableOne=ValueOne&MyVariableTwo=ValueTwo,使用%HH的形式編碼非ascii碼,不接受重復鍵值。后者接受重復鍵值、二進制文件等。參考資料
可以通過FieldStorage類獲取提交的表單數據,如果含有非asciii碼,使用encoding參數,由于它會消耗標準數據,所以應該只被實例化1次。
FieldStorage實例與python的字典相似。可以使用in檢測內容,keys, len接口也都可以使用。FieldStorage的每個值也是一個FieldStorage或者MiniFieldStorage實例。
由于表單可能存在重復的項目名,你可以使用getlist()方法。getlist(key_name)方法會返回所有key為key_name的值。
如果上傳的表單中存在文件,你可以調用值的read()函數或者readline()函數。
如果是通過application/x-www-form-urlencoded發送的數據,則沒有list, file, filename接口。
高級接口前面介紹了,如果使用FieldStorage類從數據讀取CGI。這一節,講述以西而更可讀和符合直覺的高級接口。但,前面講的技術還是有用的,比如高效處理文件上傳。
該接口包含兩個方法。使用這戲方法你可以以更一般的方式處理數據,不用擔心是否有幾個值公用一個名字。
form = cgi.FieldStorage() item = form.getvalue("item") if isinstance(item, list): # handle the list pass else: # handle the single value pass
進行類型檢查是必須的,因為會有好事的用戶,輸入重復的鍵名。
你可以使用高級接口提供的getfirst()和getlist()方法。
函數大部分函數,如cgi.parse,cgi.parse_qs,cgi.parse_qsl,已經被移植到urllib.parse。 cgi.escape被移植到html.escape。
安全問題原則:如果你啟動了一個外部程序函數,永遠不要把用戶的輸入直接傳入shell。即使要傳入也要確保只含有字母和數字、橫杠、下劃線和點。
在Unix系統上安裝CGI腳本閱讀你的HTTP服務器的文檔,找到你的CGI腳本的安裝位置,一般是在服務器目錄的cgi-bin目錄下。
確保你的腳本可被其他程序讀和執行;在Unix文件模式下處于0o755:使用chmod 0755 filename。確保第一行有shebang:
#! /usr/local/bin/python
同時,你的腳本需要執行的文件都有對應的權限。因為你的服務器被用戶nobody執行,它只能讀/寫/執行那些被所有人讀/寫/執行的文件。當前目錄和系統環境變量也可能可你目前所處的不一樣。
如果你需要從別的目錄引用模塊,使用sys.path.insert(0, "/path/to/your/module")這樣你的模塊會被首先搜索。
測試你的CGI腳本不行的是,當你從命令行嘗試CGI腳本是,它很有可能不會運行,而一個能運行的CGI腳本往往在服務器中不能運行。但你仍然應該從命令行中運行腳本,檢查一下他是否有語法錯誤。如果你的腳本沒有語法錯誤,但是它不工作,你只能讀下一節。
調試CGI腳本首先,檢查一下瑣碎的安裝錯誤,讀一下上面關于安裝的部分,能節約時間。如果你想知道你是否正確理解了安裝過程,把這個模塊文件cgi.py安裝到你的cgi腳本目錄下,啟動這個腳本,他就會將它的環境和內容以HTML的格式輸出。給他一個合適的模式,發送給他一個請求。如果它被安裝在cgi-bin目錄下,在你的瀏覽器內輸入如下url:
http://yourhostname/cgi-bin/c...
如果返回404錯誤,則說明服務器沒有找到這個腳本,或許你應該把它裝在別的目錄下。如果給了別的錯誤,說明你有安裝問題。你應該首先解決這些安裝問題,再做別的調試。如果它給出了非常整潔的環境變量和表單內容輸出,說明cgi.py被正確的安裝了。如果,你的腳本按上述過程安裝,你現在可以對他進行調試了。
下一步是在你的腳本中調用cgi模塊的test()方法,把它的主要代碼替換成cgi.test。
它應該輸出和僅安裝cgi.py時一致。
當一個普通的python腳本拋出了一個未處理的異常時,Python解釋器會把traceback打印出來,退出。當你的CGI腳本拋出異常時,Python解釋器也會這么做。這些traceback一般會在你的HTTP服務器的日志文件里,或者被丟棄了。
幸運的是,如果你的腳本執行了某些代碼,你可以通過啟用cgitb模塊,把traceback的內容發送到瀏覽器中。把下面兩行代碼加到你腳本的頂部。
import cgitb cgitb.enable()
如果你懷疑cgitb模塊有問題,你可以使用一個更魯棒的方法,只調用內置模塊:
import sys sys.stderr = sys.stdout print("Content-Type: text/plain") print()
上述代碼依賴python解釋器輸出traceback,輸出的內容的格式被指定為純文本,去除了HTML過程。如果你的腳本正常工作,你的客戶端會顯示純HTML。如果拋出了異常,前兩行打印出之后,traceback會被打印出來,如果沒有HTML解釋器進行處理,所以traceback會可讀。
常見問題及解決大多數HTTP服務器將CGI腳本的輸出放入緩沖區直至腳本完成,這意味著在腳本還在執行時,不可能在客戶端展示進度
按上述核對安裝過程
監控日志文件
先檢查語法錯誤
如果沒有語法錯誤,在腳本頂部添加import cgitb; cgitb.enable()
當啟動外部程序時,確保他們能夠被找到,通常這意味著絕對路徑名,在CGI腳本中,PATH總是被設置為一個沒啥用的值
當腳本讀寫外部文件是,確保執行CGI的userid能夠讀寫這些文件:一般來說是運行服務器的的userid,或者是服務器的suexec的userid
不要給一個CGI set-uid權限,這在大多數操作系統上不可行,而且不安全。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41112.html
摘要:最近添加的功能是通過表單上傳文件。腳本的輸出由兩部分組成,由一個空行分割。后者接受重復鍵值二進制文件等。方法會返回所有為的值。進行類型檢查是必須的,因為會有好事的用戶,輸入重復的鍵名。 cgi 通用網關接口 前驅知識 網關協議學習:CGI、FastCGI、WSGI 簡單點說: web服務器接受請求,啟動CGI;CGI接受請求,處理,返回給服務器;服務器返回給用戶 cgi效率不高,每...
摘要:腳本異常管理源代碼模塊為腳本提供了一個特殊的異常管理器。該模塊激活后,如果發生了未捕獲的異常,將會展示格式化的輸出報告。該報告包括源代碼每一層的回溯,以及當前執行程序的參數和局部變量。應當是含有異常類型異常值和對象的三元組,如同返回的那樣。 cgitb CGI腳本異常管理 源代碼: Lib/cgitb.py cgitb模塊為Python腳本提供了一個特殊的異常管理器。名字有點誤導人,它...
摘要:腳本異常管理源代碼模塊為腳本提供了一個特殊的異常管理器。該模塊激活后,如果發生了未捕獲的異常,將會展示格式化的輸出報告。該報告包括源代碼每一層的回溯,以及當前執行程序的參數和局部變量。應當是含有異常類型異常值和對象的三元組,如同返回的那樣。 cgitb CGI腳本異常管理 源代碼: Lib/cgitb.py cgitb模塊為Python腳本提供了一個特殊的異常管理器。名字有點誤導人,它...
摘要:一般來說,這一例行程序用于處理請求的每一部分,例如把路徑作為一系列字典鍵值進行處理。,必須是按照中所規定地鍵值元組列表。行為時回車換行。這個包裝器也可能用模塊指明那些有問題的,但不完全違反的行為。 wsgirf-WSGI功能及參考實現 源碼:Lib/wsgiref Web服務器網關接口(Web Server Gateway Interface, WSGI),是用Python寫的一個服務...
閱讀 2064·2021-09-22 15:43
閱讀 8618·2021-09-22 15:07
閱讀 1078·2021-09-03 10:28
閱讀 2052·2021-08-19 10:57
閱讀 1061·2020-01-08 12:18
閱讀 2972·2019-08-29 15:09
閱讀 1521·2019-08-29 14:05
閱讀 1640·2019-08-29 13:57