什麼是CGI?詳細介紹Python CGI編程

本文轉載自:http://www.php.cn/python-tutorials-362584.html....概念可以幫助理解,CGI編程什麼的真的不用過分糾結,要是大神做架構得看,我這種小白會用框架就不錯額...桑心.....

什麼是CGI

 

CGI 目前由NCSA維護,NCSA定義CGI如下:

CGI(Common Gateway Interface),通用網關接口,它是一段程序,運行在服務器上如:HTTP服務器,提供同客戶端HTML頁面的接口。

網頁瀏覽

爲了更好的瞭解CGI是如何工作的,我們可以從在網頁上點擊一個鏈接或URL的流程:

1、使用你的瀏覽器訪問URL並連接到HTTP web 服務器。

2、Web服務器接收到請求信息後會解析URL,並查找訪問的文件在服務器上是否存在,如果存在返回文件的內容,否則返回錯誤信息。

3、瀏覽器從服務器上接收信息,並顯示接收的文件或者錯誤信息。

CGI程序可以是Python腳本,PERL腳本,SHELL腳本,C或者C++程序等。

CGI架構圖

Web服務器支持及配置

在你進行CGI編程前,確保您的Web服務器支持CGI及已經配置了CGI的處理程序。

Apache 支持CGI 配置:

設置好CGI目錄:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

所有的HTTP服務器執行CGI程序都保存在一個預先配置的目錄。這個目錄被稱爲CGI目錄,並按照慣例,它被命名爲/var/www/cgi-bin目錄。

CGI文件的擴展名爲.cgi,python也可以使用.py擴展名。

默認情況下,Linux服務器配置運行的cgi-bin目錄中爲/var/www。

如果你想指定其他運行CGI腳本的目錄,可以修改httpd.conf配置文件,如下所示:

<Directory "/var/www/cgi-bin">

   AllowOverride None

   Options +ExecCGI

   Order allow,deny

   Allow from all</Directory>

在 AddHandler 中添加 .py 後綴,這樣我們就可以訪問 .py 結尾的 python 腳本文件:

AddHandler cgi-script .cgi .pl .py

第一個CGI程序

我們使用Python創建第一個CGI程序,文件名爲hello.py,文件位於/var/www/cgi-bin目錄中,內容如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-print "Content-type:text/html"print                               # 空行,告訴服務器結束頭部print '<html>'print '<head>'print '<meta charset="utf-8">'print '<title>Hello Word - 我的第一個 CGI 程序!</title>'print '</head>'print '<body>'print '<h2>Hello Word! 我是來自菜鳥教程的第一CGI程序</h2>'print '</body>'print '</html>'

文件保存後修改 hello.py,修改文件權限爲 755:

chmod 755 hello.py

這個的hello.py腳本是一個簡單的Python腳本,腳本第一行的輸出內容"Content-type:text/html"發送到瀏覽器並告知瀏覽器顯示的內容類型爲"text/html"。

用 print 輸出一個空行用於告訴服務器結束頭部信息。

HTTP頭部

hello.py文件內容中的" Content-type:text/html"即爲HTTP頭部的一部分,它會發送給瀏覽器告訴瀏覽器文件的內容類型。

HTTP頭部的格式如下:

HTTP 字段名: 字段內容

例如:Content-type: text/html

以下是一個簡單的CGI腳本輸出CGI的環境變量:

#!/usr/bin/python# -*- coding: UTF-8 -*-# filename:test.pyimport osprint "Content-type: text/html"printprint "<meta charset=\"utf-8\">"print "<b>環境變量</b><br>";print "<ul>"for key in os.environ.keys():    print "<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key])print "</ul>"

GET和POST方法

瀏覽器客戶端通過兩種方法向服務器傳遞信息,這兩種方法就是 GET 方法和 POST 方法。

使用GET方法傳輸數據

GET方法發送編碼後的用戶信息到服務端,數據信息包含在請求頁面的URL上,以"?"號分割, 如下所示:

www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

有關 GET 請求的其他一些註釋:

GET 請求可被緩存

GET 請求保留在瀏覽器歷史記錄中

GET 請求可被收藏爲書籤

GET 請求不應在處理敏感數據時使用

GET 請求有長度限制

GET 請求只應當用於取回數據

簡單的url實例:GET方法

以下是一個簡單的URL,使用GET方法向hello_get.py程序發送兩個參數:

/cgi-bin/test.py?name=菜鳥教程&url=www.runoob.com
以下爲hello_get.py文件的代碼:
#!/usr/bin/python# -*- coding: UTF-8 -*-# filename:test.py# CGI處理模塊import cgi, cgitb 

# 創建 FieldStorage 的實例化form = cgi.FieldStorage() 

# 獲取數據site_name = form.getvalue('name')site_url  = form.getvalue('url')print "Content-type:text/html"printprint "<html>"print "<head>"print "<meta charset=\"utf-8\">"print "<title>菜鳥教程 CGI 測試實例</title>"print "</head>"print "<body>"print "<h2>%s官網:%s</h2>" % (site_name, site_url)print "</body>"print "</html>"
文件保存後修改 hello_get.py,修改文件權限爲 755:


chmod 755 hello_get.py

簡單的表單實例:GET方法

以下是一個通過HTML的表單使用GET方法向服務器發送兩個數據,提交的服務器腳本同樣是hello_get.py文件,hello_get.html 代碼如下:




<!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body>

<form action="/cgi-bin/hello_get.py" method="get">站點名稱: <input type="text" name="name">  <br />

站點 URL: <input type="text" name="url" /><input type="submit" value="提交" /></form></body></html>