python中cgi到底是什么_十分钟搞懂什么是CGI(转)
原文:CGI Made Really Easy,在翻譯的過(guò)程中,我增加了一些我在學(xué)習(xí)過(guò)程中找到的更合適的資料,和自己的一些理解。不能算是嚴(yán)格的翻譯文章,應(yīng)該算是我的看這篇文章的過(guò)程的隨筆吧。
CGI真的很簡(jiǎn)單
在此之前,你或許聽說(shuō)過(guò)很多說(shuō)CGI‘晦澀難懂’的言論。如果你會(huì)寫最基本的輸入輸出,那么你就可以寫出一個(gè)CGI腳本。如果你已經(jīng)是一個(gè)程序員,你只需要幾分整就可以明白CGI到底是個(gè)什么東西。如果你還不是一個(gè)名程序員,對(duì)不起這篇文章不是很適合你,你可以先去學(xué)習(xí)一些編程的知識(shí),例如腳本語(yǔ)言或者shell編程。但你學(xué)完了這些,再回過(guò)頭來(lái)看!那么讓我們開始吧!
這篇文章是寫一個(gè)CGI腳本用于處理HTML提交的表單。雖然跳過(guò)了一些細(xì)節(jié),但是可以讓你在短時(shí)間內(nèi)搞明白。
什么是CGI?
CGI不是一門編程語(yǔ)言。它是網(wǎng)頁(yè)的表單和你寫的程序之間通信的一種協(xié)議??梢杂萌魏握Z(yǔ)言寫一個(gè)CGI腳本,這些語(yǔ)言只要能接收輸入輸出信息,讀取環(huán)境變量。所以,幾乎所有的編程語(yǔ)言都能寫一個(gè)CGI腳本,例如:python(把我大python放在第一個(gè)!),C,甚至是shell腳本。
CGI腳本的結(jié)構(gòu)
典型的CGI腳本做了如下的事情:
讀取用戶提交表單的信息。
處理這些信息(也就是實(shí)現(xiàn)業(yè)務(wù))。
輸出,返回html響應(yīng)(返回處理完的數(shù)據(jù))。
下面主要解釋,第一步和最后一步
讀取用戶提交的表單
當(dāng)用戶填寫完表單,點(diǎn)擊提交按鈕的時(shí)候。CGI腳本接收用戶表單的數(shù)據(jù),這些數(shù)據(jù)都是k-v的集合的形式(也就是python中的字典)。這里有寫實(shí)現(xiàn)的例子:python
如果你已經(jīng)通過(guò)上面的例子看懂了,下面的就可以忽略了。如果你還有些不懂請(qǐng)看下面來(lái)那兩個(gè)長(zhǎng)的字符串。
“name1=value1&name2=value2&name3=value3”
"name1=value1;name2=value2;name3=value3"
區(qū)別就是:‘&’和‘;’這兩個(gè)符號(hào),他們的作用都是分隔參數(shù)。下面還有兩件事情要做。
把所有的‘+’變成‘空格’
把所有的符號(hào)都轉(zhuǎn)譯成‘%xx’樣式的符號(hào),例如:‘%3d’轉(zhuǎn)化成‘=’
這樣做是為了統(tǒng)一用戶的輸入,使用統(tǒng)一的URL-encoded進(jìn)行轉(zhuǎn)譯。
那么你從哪里得到這些轉(zhuǎn)譯完的字符串呢?根據(jù)提交時(shí)的時(shí)候選用的是什么HTTP方法:
POST方法,通過(guò)HTTP消息主體傳遞的。注意:POST方法編碼類型有:application/x-www-form-urlencoded 或 multipart/form-data。
我找了一個(gè)很好的資料,很短,一路了然:POST對(duì)比GET方法
總結(jié):CGI接收的用戶數(shù)據(jù),是通過(guò)http協(xié)議傳遞過(guò)來(lái)的。而選用不同的‘Method’:GET或POST對(duì)CGI的接收沒有任何影響。這段是讓你明白:數(shù)據(jù)是怎么通過(guò)http協(xié)議傳輸?shù)摹?/p>
發(fā)送響應(yīng)(Response)返回給用戶
首先,第一行要寫:Content-type: text/html
新起一行,用于輸出數(shù)據(jù)。寫好HTML響應(yīng)頁(yè)面。這個(gè)頁(yè)面是:當(dāng)你的腳本處理完數(shù)據(jù)后,返回給用戶的結(jié)果。
是的,你可以隨意編寫返回的HTML代碼。HTML很簡(jiǎn)單,而且方便。
我的總結(jié)
CGI是一種通信協(xié)議,它把用戶傳遞過(guò)來(lái)的數(shù)據(jù)轉(zhuǎn)變成一個(gè)k-v的字典。這個(gè)字典中不光有用戶的數(shù)據(jù),還有HTTP協(xié)議的參數(shù)。它做的就是把數(shù)據(jù),組織成一個(gè)固定結(jié)構(gòu)形式的數(shù)據(jù)。方便任何符合CGI協(xié)議的程序都可以調(diào)用!但是CGI不是負(fù)責(zé)通信(傳輸數(shù)據(jù))的,通信的話是通過(guò)socket,也就是server,例如上面例子中,是通過(guò)Apache進(jìn)行通信。之后調(diào)用CGI腳本,把數(shù)據(jù)轉(zhuǎn)變成符合CGI協(xié)議的數(shù)據(jù)結(jié)構(gòu),用于后面的數(shù)據(jù)處理!
這個(gè)系列文章完成后,后面還有一個(gè)實(shí)戰(zhàn)系列。從頭寫一個(gè)web服務(wù)器,敬請(qǐng)期待!
http://www.cnblogs.com/xueweihan/p/5319893.html
總結(jié)
以上是生活随笔為你收集整理的python中cgi到底是什么_十分钟搞懂什么是CGI(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python日历提醒_如何通过pytho
- 下一篇: 判断frame是否已创建_大白菜的ROS