【问题标题】:mod_python with apache2, (Re)importing module error带有 apache2 的 mod_python,(重新)导入模块错误
【发布时间】:2009-04-01 15:11:15
【问题描述】:

我正在尝试让 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,其中包括以下行:

EDIT 添加 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没有效果。

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

【问题讨论】:

    标签: apache2 mod-python cgi-bin


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 好的,现在可以使用了!谢谢。使用我过去使用的基于服务器的 python,您只需将输出打印给用户。 PythonHandler 有哪些不同的选项?当我直接打印到输出(包括标题)时,我使用了哪一个?不要以为是PSP。 Python 作为 CGI 脚本?
    • 嗯,它可能是作为 CGI 脚本的 Python,或者是 mod_python 中的 CGI 处理程序。它们几乎相同。如果你想以这种方式使用 mod_python,请在你的 Apache conf 文件中使用它: PythonHandler mod_python.cgihandler 然后,你的普通 python CGI 脚本应该可以工作了。
    • +1 。我有 PythonHandler mod_python.publisher。必须将其更改为 PythonHandler mod_python.cgihandler 以使 python 脚本作为 cgi 工作。
    【解决方案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,您应该会在文件test.py中看到index函数的结果。

    【讨论】:

    • 谢谢,刚刚试过,我得到了这个奇怪的错误模式:如果脚本有错误,就会显示;脚本没有错误...引发 404!
    • 把test.py的内容贴出来怎么样? (将其编辑到您的问题中)
    【解决方案3】:

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

    def index():
      return "hello world"
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 2011-12-29
      • 1970-01-01
      • 2010-11-01
      • 2017-01-15
      • 2016-05-18
      • 2015-09-25
      • 2016-07-20
      • 2018-02-04
      相关资源
      最近更新 更多