代码之家  ›  专栏  ›  技术社区  ›  Tom Viner

mod_python with apache2,(re)导入模块错误

  •  2
  • Tom Viner  · 技术社区  · 17 年前

    我试图让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 回复  |  直到 17 年前
        1
  •  2
  •   landyman    17 年前

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

    在我的脚本中,我有如下内容:

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

    然后,去 http://.../python/test.py/run

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

    如果你还没有,你需要一个 __init__.py 文件位于test.py所在的同一目录中。

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

        2
  •  2
  •   David Z    17 年前

    首先,我建议不要使用 cgi-bin 目录,因为它是为CGI脚本设计的。用mod_python加载的python文件不是CGI脚本。(理论上,您应该能够从 CGI仓 目录,但是如果您给您的python文件提供自己的目录,调试起来会更容易。)

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

    <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 文件中的函数 Py .

        3
  •  2
  •   Thomas Weigel    17 年前

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

    def index():
      return "hello world"
    

    http://somesite.com/path/test.py “默认情况下打开函数”index“。

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

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

    推荐文章