最近一周的时间在网上继续学习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行f1f3f85950947386ceb2305656cc4f44引号里的内容也改成自己的cgi-bin所在的路径
保存之后重启服务器即可
【相关推荐】
2. 分享在IIS上用CGI方式运行Python脚本的实例教程
以上是分享一个PythonCGI编程的实例教程的详细内容。更多信息请关注PHP中文网其他相关文章!