今天在windows下面用IDLE的编辑了一个python脚本,然后使用wsgi部署在apache上面,运行的时候总是出现
Premature end of script headers: mytest.py
这个错误,mytest.py是我的脚本的文件名。
google了一堆后,有人说是因为用windows的编辑器编写的代码导致的,因为windows下面的换行符均是CRLF,而apache下面认识的是unix的换行符LF,然后我用utrledit换成unix的换行符,但是发现问题依旧,甚至我换成mac的CR的换行符也不可以。
但是如果只是保留下面未注释掉的代码就没有问题,浏览器能够得到服务器的响应并且正确显示结果。
下面把脚本列出来
#!c:/Python27/python #def application(environ, start_response): # status='200 OK' # output='Hello world' # response_headers=[('Content-type', 'text/plain'), # ('Content-Length', str(len(output)))] # start_response(status, response_headers) # return [output] from time import gmtime, strftime def showtime(): t = strftime("%Y-%m-%d %H:%M:%S", gmtime()) return t print "Content-type: text/html" print "" print "<html><head>" print "<p></p>" print "</head><body>" print "<p align=center>Hello world.</p>" print "<p></p>" print "<p align=center>" print showtime() print "</p>" print "<input type=button name='test' />" print "</body></html>"
上面的代码就是输出当前的时间而已。
在ubuntu上面的用上面被注释掉的部分就没有问题。我没有记错的,ubuntu和windows下面用的wsgi和python的版本都是一样。
先把这个问题写在这里,待我慢慢研究。希望路过对这个问题有答案或者有同样问题可以留言。
过了这么多天,这个问题终于有了答案:
是因为我的apache的配置文件的一个配置有问题,因为我加了这么一句:
AddHandler cgi-script .cgi .py
其实是加了 .py 前面的事先就有的。这就导致了apache一直把以py结尾的请求的文件视为可以直接调用的cgi的脚本,apache每次接到以py结尾的文件时,就会直接用文件最开始的程序也就是
#!c:/Python27/python
这一行指定的python来执行所请求的脚本。而不是我想要的,apache调用mod_wsgi.so,然后由这个动态库来调用python执行所请求的脚本。
我之所以在那里加 .py是因为之前,我只是配置apache和python来开发web,后来改为了apache+wsgi+python,但是忘了把这句去掉,虽然我在自己的虚拟主机的配置文件指定了
WSGIScriptAlias
<VirtualHost 127.0.0.4:80> ServerAdmin admin@system DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test" ServerName 127.0.0.4 WSGIScriptAlias /dynamic "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/dynamic" ErrorLog logs/dummy-host.example.com-error_log CustomLog logs/dummy-host.example.com-access_log common <Directory /> Options indexes AllowOverride None Order deny,allow Allow from all </Directory> <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/static"> Options FollowSymLinks AllowOverride None Order deny,allow Allow from all </Directory> <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/dynamic"> Options FollowSymLinks ExecCGI AllowOverride None Order deny,allow Allow from all </Directory> </VirtualHost>
,但是由于Addhanlder这句是在apache总的配置域中,级别高于我的虚拟机,因此apache仍然执行的是addhandler的策略。因此现在我们的解决办法有2个:
1. 去掉 addhandler中的 .py,保留WSGIScriptAlias
2. 去掉 WSGIScriptAlias, 而保留Addhandler中的 .py。
2者只要保留一个即可。
我比较倾向于第一种,因为那样,每个虚拟机就有自己的策略了。
这里需要说明另外一个问题,就是如果我们以apache+python的方式来写web,那么python脚本的第一句
#!c:/Python27/python
不可以没有,因为apache是凭借这个来确定要那个程序(在这里这个程序就是python解释器)执行对应脚本,其他的脚本程序的执行也是这样,如php和perl;而如果是apache+wsgi+python的方式的话,就可以不写,因为python是由wsgi来调用,而wsgi知道它调用的肯定是python解释器,并且它知道路径。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.