在使用Python 2.4.3的CentOS 5(Apache 2.2.3)服务器上安装和配置mod_python 3.2.8。 Apache可以很好地加载它。
我激活了mpinfo测试页面并且它可以工作。所以我用以下代码写了一个简单的“Hello World”:
from mod_python import apache
def handler(req):
req.content_type = 'text/plain'
req.write("Hello World!")
req.flush()
return apache.OK
它输出一个空白页面,没有文字,也没有来源。如果我有意识地创建语法错误,我会在URL上获得错误输出,例如(当我在“def”之前放置一个空格时):
Mod_python error: "PythonHandler mod_python.cgihandler"
Traceback (most recent call last):
File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 299, in HandlerDispatch
result = object(req)
File "/usr/lib/python2.4/site-packages/mod_python/cgihandler.py", line 96, in handler
imp.load_module(module_name, fd, path, desc)
File "/var/www/vhosts/localhost/httpdocs/mptest.py", line 3
def handler(req):
^
SyntaxError: invalid syntax
我花了大约五个小时浏览不同的教程,常见问题解答和故障排除指南,但无法找到这个exakt问题的描述。
您认为问题/原因是什么?
编辑:以下是该网站的Apache配置...
<Directory />
Options FollowSymLinks
AllowOverride None
AddHandler mod_python .py
PythonHandler mptest
PythonDebug On
</Directory>
编辑2:啊,我忘了提到的另一件事是我打算用mod_python编写Apache扩展。应用程序本身是用PHP编写的,但我需要在服务器上做一些安全性调整:)
答案 0 :(得分:2)
请勿使用mod_python
。
一个常见的错误是将mod_python
作为“ mod_php
,但对于python ”并且不正确。 mod_python
更适合编写apache扩展,而不是Web应用程序。
python Web应用程序和Web服务器(不仅仅是apache)之间使用的standartized协议是WSGI。使用它可确保您可以将应用程序发布到任何符合wsgi标准的Web服务器(几乎所有现代Web服务器都符合wsgi)
在apache上,请改用mod_wsgi
。
您的示例使用wsgi标准和apache上的mod_wsgi
重写:
mywebapp.py
:
def application(environ, start_response):
start_response('200 OK', [('content-type', 'text/plain')])
return ['Hello World']
Apache配置:
WSGIScriptAlias /myapp /usr/local/www/wsgi-scripts/mywebapp.py
<Directory /usr/local/www/wsgi-scripts>
Order allow,deny
Allow from all
</Directory>
现在转到http://localhost/myapp
,脚本就会运行。此外,此根目录下的任何访问权限(即http://localhost/myapp/stuff/here
)都将由此脚本处理。
选择Web框架是个好主意。 CherryPy。 Pylons。 Django。他们让事情变得更加容易。
要查看的好网站是wsgi.org
答案 1 :(得分:1)
您最初的问题是调用mod_python.cgihandler来处理请求。这意味着您的Python脚本文件被解释为CGI脚本。因此,难怪它不会返回任何东西。
您的Apache配置中可能存在冲突的定义,即启用mod_python.cgihandler。
答案 2 :(得分:0)
为了清晰起见,我提出了一个全新的答案......
我决定安装mod_wsgi。所以我已经设置好了,当我转到我的测试文件时,我只看到页面源代码。我还没有花时间去寻找问题,所以当我解决问题或决定需要更多帮助时,我会回复你。)
谢谢:)