最近一周的时间在网上继续学习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文件如下:
"/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI
Order allow,deny
Allow from all
然后在
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 '' print '' print '第一行的内容指定了脚本解释器的位置,可以根据自己安装的路径更改Hello Word - First CGI Program ' print '' print '' print 'Hello Word! This is my first CGI program
' print '' print ''
然后在浏览器地址栏输入: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 "" print "" print "在浏览器输入http://localhost/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALIHello - Second CGI Program " print "" print "" print "Hello %s %s
" % (first_name, last_name) print "" print ""
然而并没有像网站上说的那样输出
因为这个于是我坚定不移地相信是因为我把服务器配置错了,正当我一筹莫展的时候,我突然想到,我之前没有修改任何配置文件时,第一个程序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行
保存之后重启服务器即可