国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

通讀Python官方文檔之cgi

lncwwn / 1842人閱讀

摘要:最近添加的功能是通過表單上傳文件。腳本的輸出由兩部分組成,由一個空行分割。后者接受重復(fù)鍵值二進(jìn)制文件等。方法會返回所有為的值。進(jìn)行類型檢查是必須的,因為會有好事的用戶,輸入重復(fù)的鍵名。

cgi 通用網(wǎng)關(guān)接口 前驅(qū)知識

網(wǎng)關(guān)協(xié)議學(xué)習(xí):CGI、FastCGI、WSGI

簡單點說:

web服務(wù)器接受請求,啟動CGICGI接受請求,處理,返回給服務(wù)器;服務(wù)器返回給用戶

cgi效率不高,每次都要fork一個新進(jìn)程出來

WCGIPython架設(shè)的一個橋,連接了服務(wù)器和web框架,相當(dāng)將cgi的連接功能獨立了出來,并把處理功能留給了web框架

簡介

CGI腳本由HTTP服務(wù)器啟動,通常用來處理用戶通過提交的數(shù)據(jù)。

通常,CGI腳本位于服務(wù)器的專門的cgi-bin目錄下。HTTP服務(wù)器在腳本的shell環(huán)境中放置了請求相關(guān)的信息,比如客戶端的hostname,請求的url,請求的字符串以及其他東西。服務(wù)器執(zhí)行腳本,并把輸出返回給客戶端。

腳本的輸入也和客戶端相連,有時表單數(shù)據(jù)是通過這種方式讀取的。其他時候,表單數(shù)據(jù)是通過URLquery字符串傳遞的。這個模塊用于處理不同的情況,提供一個簡單的接口。同時提供了一些功能,幫助調(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-urlencodedmultipart/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)方法會返回所有keykey_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.parsecgi.parse_qscgi.parse_qsl,已經(jīng)被移植到urllib.parsecgi.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

相關(guān)文章

  • 通讀Python官方文檔cgi

    摘要:最近添加的功能是通過表單上傳文件。腳本的輸出由兩部分組成,由一個空行分割。后者接受重復(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效率不高,每...

    thursday 評論0 收藏0
  • 通讀Python官方文檔cgitb

    摘要:腳本異常管理源代碼模塊為腳本提供了一個特殊的異常管理器。該模塊激活后,如果發(fā)生了未捕獲的異常,將會展示格式化的輸出報告。該報告包括源代碼每一層的回溯,以及當(dāng)前執(zhí)行程序的參數(shù)和局部變量。應(yīng)當(dāng)是含有異常類型異常值和對象的三元組,如同返回的那樣。 cgitb CGI腳本異常管理 源代碼: Lib/cgitb.py cgitb模塊為Python腳本提供了一個特殊的異常管理器。名字有點誤導(dǎo)人,它...

    laoLiueizo 評論0 收藏0
  • 通讀Python官方文檔cgitb

    摘要:腳本異常管理源代碼模塊為腳本提供了一個特殊的異常管理器。該模塊激活后,如果發(fā)生了未捕獲的異常,將會展示格式化的輸出報告。該報告包括源代碼每一層的回溯,以及當(dāng)前執(zhí)行程序的參數(shù)和局部變量。應(yīng)當(dāng)是含有異常類型異常值和對象的三元組,如同返回的那樣。 cgitb CGI腳本異常管理 源代碼: Lib/cgitb.py cgitb模塊為Python腳本提供了一個特殊的異常管理器。名字有點誤導(dǎo)人,它...

    KunMinX 評論0 收藏0
  • 通讀Python官方文檔wsgiref(未完成)

    摘要:一般來說,這一例行程序用于處理請求的每一部分,例如把路徑作為一系列字典鍵值進(jìn)行處理。,必須是按照中所規(guī)定地鍵值元組列表。行為時回車換行。這個包裝器也可能用模塊指明那些有問題的,但不完全違反的行為。 wsgirf-WSGI功能及參考實現(xiàn) 源碼:Lib/wsgiref Web服務(wù)器網(wǎng)關(guān)接口(Web Server Gateway Interface, WSGI),是用Python寫的一個服務(wù)...

    mumumu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<