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