CGI(Common Gateway Interface),通用網關接口,它是一段程序,運行在服務器上如:HTTP服務器,提供同客戶端HTML頁面的接口。
我比較感興趣的是Python CGI能寫出多厲害的應用程序,所以我就直接開始學習了Python的編程部分,首先要配置Web服務器支持CGI,我電腦上已經裝好了wamp集成開發環境,所以就不用裝Apache了,網上有很多博文都是講的如何在Apache下配置,而且是Linux環境下的,不過我想配置文件內容應該不會有很大變化,于是我就開始了我的鼓搗之旅。事實證明用windows來做開發真的是個坑。
根據在線學習網站Python CGI的說法,要先設置好CGI目錄,在Apache的配置文件中修改httpd.conf
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
再修改httpd.conf文件如下:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all</Directory>
然后在AddHandler 中添加 .py 后綴,這樣我們就可以訪問 .py 結尾的 python 腳本文件:
做完這一切之后重新啟動服務器(Apache/Wamp),編寫第一個CGI程序,代碼如下:
test1.py
#!D:Python27python # -*- coding: UTF-8 -*-print "Content-type:text/html "print '<html>'print '<head>'print '<title>Hello Word - First CGI Program</title>'print '</head>'print '<body>'print '<h2>Hello Word! This is my first CGI program</h2>'print '</body>'print '</html>'
第一行的內容指定了腳本解釋器的位置,可以根據自己安裝的路徑更改
然后在瀏覽器地址欄輸入:http://localhost/cgi-bin/test1.py
然后瀏覽器訪問顯示結果如下:
Hello Word! This is my first CGI program
沒有什么問題
然后編寫第二個程序:hello_get.py
#!D:Python27python# -*- coding: UTF-8 -*-# CGI處理模塊import cgi, cgitb # 創建 FieldStorage 的實例化form = cgi.FieldStorage() # 獲取數據first_name = form.getvalue('first_name')last_name = form.getvalue('last_name')print "Content-type:text/html "print "<html>"print "<head>"print "<title>Hello - Second CGI Program</title>"print "</head>"print "<body>"print "<h2>Hello %s %s</h2>" % (first_name, last_name)print "</body>"print "</html>"
在瀏覽器輸入localhost/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI
然而并沒有像網站上說的那樣輸出
而是出現了以下的錯誤提示
于是我就納悶了,配置環境一樣,代碼都是一模一樣,到底是哪里出問題了呢,然后我就百度Windows下Apache CGI配置方法,然而出來的都是Linux下的配置方法,于是沒辦法,我選擇了重裝wamp然后重新配置CGI環境,然后我依次將上面的每一步又都做了一遍,然后將網站上的代碼復制到編輯器然后再次在瀏覽器中輸入:
http://localhost/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI
結果仍然是上面那一串錯誤提示,于是我仔細看了一下這個提示,大致意思就是:
服務器內部錯誤
服務器發生了一個內部錯誤或者由于錯誤配置從而無法完成我的請求
請郵件聯系服務器管理員告知這個錯誤以及出現這個錯誤之前你做了什么操作
想了解更多信息請查閱服務器錯誤日志
因為這個于是我堅定不移地相信是因為我把服務器配置錯了,正當我一籌莫展的時候,我突然想到,我之前沒有修改任何配置文件時,第一個程序test1都能正確運行,會不會這個錯誤與配置文件無關呢,于是我試著把test1的第一行聲明解釋器路徑的那一條語句去掉了,再次運行,瀏覽器中出現了同樣的錯誤
所以我大感欣慰,因為這證實了我的猜想,和服務器的配置沒有關系,是因為我的腳本文件有錯,所以服務器無法回應請求,既然如此,那hello_get.py的錯誤也同樣如此了,那么問題就簡單多了,只要檢查代碼有沒有寫錯的地方就行了。
這里我要反思自己的一個陋習:當我嘗試著運行網站上的一個例程的時候,我總是一個ctrl C然后ctrl V復制粘貼到自己的編輯器中,簡單一點的程序還好,復雜一點的,代碼塊很多的程序,這樣的習慣帶來的后果就是:縮進格式不正確,然后運行錯誤,這個問題在Python中體現得尤其明顯,因為Python對縮進要求真的非常嚴格,所以千萬不能復制粘貼Python程序到自己的程序中,一定要一個代碼一個代碼的敲,確保縮進在自己的控制之下。
我說到這里明白人已經看出我hello_get.py文件的錯誤之處在哪里了——就是沒有自己動手敲,其實我之前也試過在網上copy C語言代碼到VC++6.0里面,表面看上去語法完全正確,但是下面總有一個錯誤,提示也是看不懂的,所以在遇到這種情況的時候我才能想到可能是這個原因。這也警示大家,代碼一定要自己動手一個字母一個符號地敲進你的程序當中,否則就會出現難以發覺的錯誤。
最后說說如何正確配置Windows下的wamp(Apache)才能正確執行CGI腳本,步驟很簡單:
打開httpd.conf
將371行的
ScriptAlias /cgi-bin/ "D:/wamp/bin/apache/apache2.4.9/cgi-bin/"前面的#號去掉,就是解除注釋,將后面引號里的D:/wamp/bin/apache/apache2.4.9/cgi-bin/改成自己的cgi-bin所在的路徑
將387行<Directory "D:/wamp/bin/apache/apache2.4.9/cgi-bin">引號里的內容也改成自己的cgi-bin所在的路徑
保存之后重啟服務器即可
【相關推薦】
1. 詳解cgi向文本或者數據庫寫入數據實例代碼
2. 分享在IIS上用CGI方式運行Python腳本的實例教程
3. 使用CGI模塊建立簡單web頁面教程實例
4. 什么是CGI?詳細介紹Python CGI編程
5. 詳解XML與現代CGI應用程序的示例代碼
6. FastCGI 進程意外退出造成500錯誤
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com