带有apache2的mod_python,(重新)导入模块错误

时间:2009-04-01 15:11:16

标签: apache2 mod-python cgi-bin

我正在尝试使用mod-python来处理apache2但没有取得任何成功。我已经按照一些教程来获得mod-python的工作,但我看不出我做错了什么。

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

这是我的设置:

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

# 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

完整档案here,其中包含以下行:

编辑添加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没有任何影响。

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

3 个答案:

答案 0 :(得分: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函数的结果。

答案 1 :(得分:2)

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

在我的脚本中,我有类似的东西:

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

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

在这种情况下,req是由Publisher Handler传入的请求对象。

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

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

答案 2 :(得分:2)

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

def index():
  return "hello world"

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

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

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