【问题标题】:Mod_python produces no outputMod_python 不产生任何输出
【发布时间】:2009-10-02 08:51:43
【问题描述】:

刚刚使用 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

我花了大约五个小时浏览不同的教程、常见问题解答和故障排除指南,但找不到关于此问题的描述。

您认为可能是什么问题/原因?

编辑:这是该站点的 Apache 配置...

<Directory />
    Options FollowSymLinks
    AllowOverride None

    AddHandler mod_python .py
    PythonHandler mptest
    PythonDebug On 
</Directory>

编辑 2: 啊,我忘了提到的另一件事是我打算使用 mod_python 来编写 Apache 扩展。应用程序本身是用 PHP 编写的,但我需要在服务器上进行一些安全处理 :)

【问题讨论】:

  • 澄清一下,问题不是错误消息,而是没有产生输出。
  • 尝试修改 Apache 配置部分以指向源目录
  • 看看 Apache 错误日志可能会有所帮助...
  • 在没有语法错误的情况下,错误日志根本不包含任何内容。更改 配置没有任何区别。
  • 你在谈论什么样的安全调整。其他人向您指出的 mod_wsgi 模块具有定义身份验证提供程序、授权控制和一般访问控制的能力。它实现它们的方式比 mod_python 更容易使用。请参阅“code.google.com/p/modwsgi/wiki/AccessControlMechanisms”。顺便说一句,你为什么要使用过时且有缺陷的 mod_python 版本。那个版本很古老。最新的是 3.3.1,即使它已经很老了,因为不再有效地维护,它仍然存在各种错误。

标签: python apache mod-python


【解决方案1】:

不要使用mod_python

一个常见的错误是将mod_python 视为“mod_php,但用于python”,这是不正确mod_python 更适合编写 apache 扩展,而不是 Web 应用程序。

在 Python Web 应用程序和 Web 服务器(不仅是 Apache)之间使用的 standartized 协议是 WSGI。使用它可确保您可以将应用程序发布到任何符合 wsgi 的网络服务器(几乎所有现代网络服务器都符合 wsgi)

在 apache 上,请改用 mod_wsgi

您的示例使用 wsgi 标准和 mod_wsgi 在 apache 上重写:

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)都将由此脚本处理。

选择网络框架是个好主意。 CherryPyPylonsDjango。它们使事情变得更容易。

一个不错的网站是wsgi.org

【讨论】:

  • 啊,还有一件事我忘了说,我打算用 mod_python 来写 Apache 扩展。应用程序本身是用 PHP 编写的,但我需要在服务器上进行一些安全性 tweeks :) 但是我很快将通过 Python 尝试更多的 Web 开发,然后我将使用 Django。感谢您的信息。这对未来的应用会有帮助:)
【解决方案2】:

您最初的问题是调用 mod_python.cgihandler 来处理请求。这意味着您的 Python 脚本文件被解释为 CGI 脚本。因此,难怪它什么都不返回。

您可能在启用 mod_python.cgihandler 的 Apache 配置中有冲突的定义。

【讨论】:

    【解决方案3】:

    为了清楚起见,我做了一个全新的答案......

    我决定改为安装 mod_wsgi。所以我已经设置好了,当我进入我的测试文件时,我只看到了页面源代码。我还没有花任何时间来查找问题,所以当我解决问题或决定我需要更多帮助时,我会回复你:)

    谢谢你:)

    【讨论】:

    • 好的,所以我完全按照项目网站上的指南安装了 nosklo 建议的 mod_wsgi 2.6(使用 tweeks 以适应我的服务器)。但是我的 testapp 的输出是 Python 源代码。我没有通过谷歌找到任何提示。你怎么看?
    • @Christoffer:不要将.py 文件放入您的网络根目录。 .py 文件应位于 /var/www 之外的另一个文件夹中。我在示例中选择了/usr/local/www/wsgi-scriptsWSGIScriptAlias apache 配置选项将在必须从服务器请求的路径和将要运行的脚本之间架起一座桥梁,因此您无需访问 http://yourserver/path/thescript.py,您只需转到 http://yourselver/pathdefinedinconfig/ 。在我回答的示例中,它是 http://server/myapp,即使 这不是脚本的名称
    猜你喜欢
    • 2017-02-03
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多