我正在尝试使用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没有任何影响。
我可以添加任何其他信息来帮助诊断吗?
答案 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文件放入 - 仅用于测试。不要为此目录创建任何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
中看到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页面。