2

我试图让 mod-python 与 apache2 一起工作,但没有任何成功。我已经遵循了一些让 mod-python 工作的教程,但我看不出我做错了什么。

当我访问http://site.example.com/cgi-bin/test.py时,我实际上得到了我的 404 页面!(而如果文件确实不存在,我会收到 403 禁止)

这是我的设置:

在 /etc/apache2/sites-enabled/ 中有以我的每个域命名的配置文件。在site.example.com 文件中,我已将其添加到用户指令部分:

# Begin user directives <--
<Directory /home/default/site.example.com/user/htdocs/cgi-bin/>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride AuthConfig
     Order allow,deny
     allow from all
     AddHandler mod_python .py
     PythonHandler mod_python.publisher
     PythonDebug On
</Directory>
# --> End user directives

此处的完整文件,其中包括以下行:

编辑以添加 test.py 的内容:

#!/usr/bin/python  
print "Content-type: text/html"  
print  
print 'hello world'  
#print 1/0

如上所示,我得到一个404 /python/test.py was not found on this server.

但是,如果我取消注释最后一行,我会得到:

Mod_python error: "PythonHandler mod_python.publisher"

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/publisher.py", line 98, in handler
    path=[path])

  File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 457, in import_module
    module = imp.load_module(mname, f, p, d)

  File "/home/default/site.example.co.uk/user/htdocs/python/test.py", line 5, in ?
    print 1/0

ZeroDivisionError: integer division or modulo by zero

这个回溯看起来对吗?顺便说一句,启用 cgitb 没有任何效果。

我可以添加任何其他信息来帮助诊断吗?

4

3 回答 3

2

对于初学者,我建议不要使用该cgi-bin目录,因为它是为 CGI 脚本设计的。使用 mod_python 加载的 Python 文件不是 CGI 脚本。(理论上你应该能够从cgi-bin目录中加载 Python 文件,但是如果你给你的 Python 文件自己的目录,它会更容易调试。)

现在,您的文档根目录是/home/default/site.example.com/user/htdocs,所以我建议创建一个子目录,例如/home/default/site.example.com/user/htdocs/python,将您的 Python 文件放入其中 - 仅用于测试。不要为此目录创建任何AliasScriptAlias指令(因为它已经在文档根目录下),但是您需要在虚拟主机文件中放置类似的内容:

<Directory /home/default/site.example.com/user/htdocs/python/>
     Order allow,deny
     Allow from all
     AddHandler mod_python .py
     PythonHandler mod_python.publisher
     PythonDebug On
</Directory>

.将文件test.py移动到该目录并尝试转到http://site.example.com/python/test.py,您应该会index在文件中看到函数的结果test.py

于 2009-04-01T15:37:02.437 回答
2

据我所知,Publisher 处理程序需要接受一个请求对象和一个方法才能返回响应。

在我的脚本中,我有这样的东西:

#!/usr/bin/python  
def run(req):
  return 'Hello world!'

然后,转到http://.../python/test.py/run

在这种情况下,req 是发布者处理程序传入的请求对象。

而且,如果您还没有文件,则需要__init__.py在 test.py 所在的同一目录中有一个文件。

此外,对于发布者,我注意到有时响应会被缓存。我将在我已经修复的浏览器中得到相同的错误。因此,如果您看到您认为已经修复的错误,重新启动 apache 并不是一个坏主意。

于 2009-04-02T16:33:46.000 回答
2

为了获得所需的输出,python 文件应如下所示:

def index():
  return "hello world"

http://somesite.com/path/test.py ”默认打开“索引”功能。

http://somesite.com/path/test.py/run ”改为打开“运行”功能。

你可以变得更漂亮,但上面会给你一个基本的 mod_python 页面。

于 2009-04-20T22:34:02.210 回答