成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

通讀Python官方文檔之cgi

lncwwn / 1866人閱讀

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

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

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

簡(jiǎn)單點(diǎn)說(shuō):

web服務(wù)器接受請(qǐng)求,啟動(dòng)CGI;CGI接受請(qǐng)求,處理,返回給服務(wù)器;服務(wù)器返回給用戶(hù)

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

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

簡(jiǎn)介

CGI腳本由HTTP服務(wù)器啟動(dòng),通常用來(lái)處理用戶(hù)通過(guò)提交的數(shù)據(jù)。

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

腳本的輸入也和客戶(hù)端相連,有時(shí)表單數(shù)據(jù)是通過(guò)這種方式讀取的。其他時(shí)候,表單數(shù)據(jù)是通過(guò)URLquery字符串傳遞的。這個(gè)模塊用于處理不同的情況,提供一個(gè)簡(jiǎn)單的接口。同時(shí)提供了一些功能,幫助調(diào)試腳本。最近添加的功能是通過(guò)表單上傳文件。

CGI腳本的輸出由兩部分組成,由一個(gè)空行分割。第一部分包含一些頭部,告訴客戶(hù)接下來(lái)返回的是什么數(shù)據(jù)。大概是這樣:

print("Content-Type: text/html")    # 接下來(lái)返回的是html
print()                             # 空白行,頭部結(jié)束

第二部分,一般來(lái)說(shuō)是HTML??蛻?hù)端軟件可以展示這些頁(yè)面,圖片什么的。

使用cgi模塊

當(dāng)你寫(xiě)一個(gè)新的腳本時(shí),添加下面這兩行:

import cgitb
cigtb.enable()

這將會(huì)激活一個(gè)異常處理器,如果發(fā)生了錯(cuò)誤,它就會(huì)把錯(cuò)誤返回給瀏覽器。如果你不想讓用戶(hù)看到,也可以指定輸出目錄。

import cgitb
cgitb.enable(display=0, logdir="/path/to/logdir")

補(bǔ)充:

POST請(qǐng)求提交數(shù)據(jù)有兩種方式application/x-www-form-urlencodedmultipart/form-data。前者形如MyVariableOne=ValueOne&MyVariableTwo=ValueTwo,使用%HH的形式編碼非ascii碼,不接受重復(fù)鍵值。后者接受重復(fù)鍵值、二進(jìn)制文件等。參考資料

可以通過(guò)FieldStorage類(lèi)獲取提交的表單數(shù)據(jù),如果含有非asciii碼,使用encoding參數(shù),由于它會(huì)消耗標(biāo)準(zhǔn)數(shù)據(jù),所以應(yīng)該只被實(shí)例化1次。

FieldStorage實(shí)例與python的字典相似??梢允褂?b>in檢測(cè)內(nèi)容,keys, len接口也都可以使用。FieldStorage的每個(gè)值也是一個(gè)FieldStorage或者MiniFieldStorage實(shí)例。

由于表單可能存在重復(fù)的項(xiàng)目名,你可以使用getlist()方法。getlist(key_name)方法會(huì)返回所有keykey_name的值。

如果上傳的表單中存在文件,你可以調(diào)用read()函數(shù)或者readline()函數(shù)。

如果是通過(guò)application/x-www-form-urlencoded發(fā)送的數(shù)據(jù),則沒(méi)有list, file, filename接口。

高級(jí)接口

前面介紹了,如果使用FieldStorage類(lèi)從數(shù)據(jù)讀取CGI。這一節(jié),講述以西而更可讀和符合直覺(jué)的高級(jí)接口。但,前面講的技術(shù)還是有用的,比如高效處理文件上傳。

該接口包含兩個(gè)方法。使用這戲方法你可以以更一般的方式處理數(shù)據(jù),不用擔(dān)心是否有幾個(gè)值公用一個(gè)名字。

form = cgi.FieldStorage()

item = form.getvalue("item")
if isinstance(item, list):
    # handle the list
    pass
else:
    # handle the single value
    pass

進(jìn)行類(lèi)型檢查是必須的,因?yàn)闀?huì)有好事的用戶(hù),輸入重復(fù)的鍵名。

你可以使用高級(jí)接口提供的getfirst()getlist()方法。

函數(shù)

大部分函數(shù),如cgi.parse,cgi.parse_qscgi.parse_qsl,已經(jīng)被移植到urllib.parse。 cgi.escape被移植到html.escape。

安全問(wèn)題

原則:如果你啟動(dòng)了一個(gè)外部程序函數(shù),永遠(yuǎn)不要把用戶(hù)的輸入直接傳入shell。即使要傳入也要確保只含有字母和數(shù)字、橫杠、下劃線和點(diǎn)。

Unix系統(tǒng)上安裝CGI腳本

閱讀你的HTTP服務(wù)器的文檔,找到你的CGI腳本的安裝位置,一般是在服務(wù)器目錄的cgi-bin目錄下。

確保你的腳本可被其他程序讀和執(zhí)行;在Unix文件模式下處于0o755:使用chmod 0755 filename。確保第一行有shebang:

#! /usr/local/bin/python

同時(shí),你的腳本需要執(zhí)行的文件都有對(duì)應(yīng)的權(quán)限。因?yàn)槟愕姆?wù)器被用戶(hù)nobody執(zhí)行,它只能讀/寫(xiě)/執(zhí)行那些被所有人讀/寫(xiě)/執(zhí)行的文件。當(dāng)前目錄和系統(tǒng)環(huán)境變量也可能可你目前所處的不一樣。

如果你需要從別的目錄引用模塊,使用sys.path.insert(0, "/path/to/your/module")這樣你的模塊會(huì)被首先搜索。

測(cè)試你的CGI腳本

不行的是,當(dāng)你從命令行嘗試CGI腳本是,它很有可能不會(huì)運(yùn)行,而一個(gè)能運(yùn)行的CGI腳本往往在服務(wù)器中不能運(yùn)行。但你仍然應(yīng)該從命令行中運(yùn)行腳本,檢查一下他是否有語(yǔ)法錯(cuò)誤。如果你的腳本沒(méi)有語(yǔ)法錯(cuò)誤,但是它不工作,你只能讀下一節(jié)。

調(diào)試CGI腳本

首先,檢查一下瑣碎的安裝錯(cuò)誤,讀一下上面關(guān)于安裝的部分,能節(jié)約時(shí)間。如果你想知道你是否正確理解了安裝過(guò)程,把這個(gè)模塊文件cgi.py安裝到你的cgi腳本目錄下,啟動(dòng)這個(gè)腳本,他就會(huì)將它的環(huán)境和內(nèi)容以HTML的格式輸出。給他一個(gè)合適的模式,發(fā)送給他一個(gè)請(qǐng)求。如果它被安裝在cgi-bin目錄下,在你的瀏覽器內(nèi)輸入如下url:

http://yourhostname/cgi-bin/c...

如果返回404錯(cuò)誤,則說(shuō)明服務(wù)器沒(méi)有找到這個(gè)腳本,或許你應(yīng)該把它裝在別的目錄下。如果給了別的錯(cuò)誤,說(shuō)明你有安裝問(wèn)題。你應(yīng)該首先解決這些安裝問(wèn)題,再做別的調(diào)試。如果它給出了非常整潔的環(huán)境變量和表單內(nèi)容輸出,說(shuō)明cgi.py被正確的安裝了。如果,你的腳本按上述過(guò)程安裝,你現(xiàn)在可以對(duì)他進(jìn)行調(diào)試了。

下一步是在你的腳本中調(diào)用cgi模塊的test()方法,把它的主要代碼替換成cgi.test。

它應(yīng)該輸出和僅安裝cgi.py時(shí)一致。

當(dāng)一個(gè)普通的python腳本拋出了一個(gè)未處理的異常時(shí),Python解釋器會(huì)把traceback打印出來(lái),退出。當(dāng)你的CGI腳本拋出異常時(shí),Python解釋器也會(huì)這么做。這些traceback一般會(huì)在你的HTTP服務(wù)器的日志文件里,或者被丟棄了。

幸運(yùn)的是,如果你的腳本執(zhí)行了某些代碼,你可以通過(guò)啟用cgitb模塊,把traceback的內(nèi)容發(fā)送到瀏覽器中。把下面兩行代碼加到你腳本的頂部。

import cgitb
cgitb.enable()

如果你懷疑cgitb模塊有問(wèn)題,你可以使用一個(gè)更魯棒的方法,只調(diào)用內(nèi)置模塊:

import sys
sys.stderr = sys.stdout
print("Content-Type: text/plain")
print()

上述代碼依賴(lài)python解釋器輸出traceback,輸出的內(nèi)容的格式被指定為純文本,去除了HTML過(guò)程。如果你的腳本正常工作,你的客戶(hù)端會(huì)顯示純HTML。如果拋出了異常,前兩行打印出之后,traceback會(huì)被打印出來(lái),如果沒(méi)有HTML解釋器進(jìn)行處理,所以traceback會(huì)可讀。

常見(jiàn)問(wèn)題及解決

大多數(shù)HTTP服務(wù)器將CGI腳本的輸出放入緩沖區(qū)直至腳本完成,這意味著在腳本還在執(zhí)行時(shí),不可能在客戶(hù)端展示進(jìn)度

按上述核對(duì)安裝過(guò)程

監(jiān)控日志文件

先檢查語(yǔ)法錯(cuò)誤

如果沒(méi)有語(yǔ)法錯(cuò)誤,在腳本頂部添加import cgitb; cgitb.enable()

當(dāng)啟動(dòng)外部程序時(shí),確保他們能夠被找到,通常這意味著絕對(duì)路徑名,在CGI腳本中,PATH總是被設(shè)置為一個(gè)沒(méi)啥用的值

當(dāng)腳本讀寫(xiě)外部文件是,確保執(zhí)行CGI的userid能夠讀寫(xiě)這些文件:一般來(lái)說(shuō)是運(yùn)行服務(wù)器的的userid,或者是服務(wù)器的suexec的userid

不要給一個(gè)CGI set-uid權(quán)限,這在大多數(shù)操作系統(tǒng)上不可行,而且不安全。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/51637.html

相關(guān)文章

  • 通讀Python官方文檔cgi

    摘要:最近添加的功能是通過(guò)表單上傳文件。腳本的輸出由兩部分組成,由一個(gè)空行分割。后者接受重復(fù)鍵值二進(jìn)制文件等。方法會(huì)返回所有為的值。進(jìn)行類(lèi)型檢查是必須的,因?yàn)闀?huì)有好事的用戶(hù),輸入重復(fù)的鍵名。 cgi 通用網(wǎng)關(guān)接口 前驅(qū)知識(shí) 網(wǎng)關(guān)協(xié)議學(xué)習(xí):CGI、FastCGI、WSGI 簡(jiǎn)單點(diǎn)說(shuō): web服務(wù)器接受請(qǐng)求,啟動(dòng)CGI;CGI接受請(qǐng)求,處理,返回給服務(wù)器;服務(wù)器返回給用戶(hù) cgi效率不高,每...

    thursday 評(píng)論0 收藏0
  • 通讀Python官方文檔cgitb

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

    laoLiueizo 評(píng)論0 收藏0
  • 通讀Python官方文檔cgitb

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

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

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

    mumumu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<