最近一週的時間在網路上繼續學習Python,接觸到了Python的CGI編程,CGI的官方定義如下:
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:\Python27\python # -*- coding: UTF-8 -*-print "Content-type:text/html\r\n\r\n"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:\Python27\python# -*- 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\r\n\r\n"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行
保存之后重启服务器即可
【相关推荐】
2. 分享在IIS上用CGI方式运行Python脚本的实例教程
以上是分享一個PythonCGI程式設計的實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!