我是mod_python和Apache的新手,我在向GET请求后将文件返回给用户时遇到了麻烦。我现在有一个非常简单的设置,并希望只是打开文件并将其写入响应:
from mod_python import apache
def handler(req):
req.content_type = 'application/octet-stream'
fIn = open('response.bin', 'rb')
req.write(fIn.read())
fIn.close()
return apache.OK
但是,我在使用open()时遇到错误,说该文件不存在(即使我已经检查了十几次)。使用相对和绝对文件路径时会发生这种情况。
我有两个问题:
由于
编辑:找到这个帖子后:http://www.programmingforums.org/thread12384.html我发现open()对我有用,如果我把文件移到家外的另一个目录(我是/ home / myname / httpdocs的别名,但它如果我使用/ data,则有效。任何想法为何起作用?
编辑2:我发送的部分调试错误:
MOD_PYTHON ERROR
ProcessId: 13642
Interpreter: '127.0.1.1'
ServerName: '127.0.1.1'
DocumentRoot: '/var/www'
URI: '/test/mptest.py'
Location: None
Directory: '/home/myname/httpdocs/'
Filename: '/home/myname/httpdocs/mptest.py'
PathInfo: ''
Phase: 'PythonHandler'
Handler: 'mptest'
Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1537, in HandlerDispatch
default=default_handler, arg=req, silent=hlist.silent)
File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1229, in _process_target
result = _execute_target(config, req, object, arg)
File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1128, in _execute_target
result = object(arg)
File "/home/myname/httpdocs/mptest.py", line 13, in handler
fIn = open('/home/myname/httpdocs/files/response.bin', 'rb')
IOError: [Errno 2] No such file or directory: '/home/myname/httpdocs/files/response.bin'
答案 0 :(得分:4)
要调试此类事情,您需要从正在运行的mod_python实例中收集所有信息。
停止搞乱“检查它[存在]十几次”。有些假设不正确。
执行此类操作以获取一些调试信息。
def handler(req):
req.content_type = 'text/plain'
req.write(os.environ)
req.write(os.getcwd())
# etc.
return apache.OK
修改强>
现在您可以瞥见重要资料。在这种情况下,它可能是权限 - 您需要使用os.filestat来确定。 Apache以几乎没有可用权限的用户身份运行mod_python。 Apache也不喜欢链接,但这不应该影响mod_python。如果您的文件没有每个人都读过,并且不在正确的目录中,那么您将遇到问题。
您可能想切换到mod_wsgi。
答案 1 :(得分:0)
你能粘贴你得到的错误吗?
可能是权限错误(如果您尝试使用文件的完整路径)。请记住,脚本以运行Web服务器进程的用户身份运行 - 因此您通常会将文件作为“www-data”或“nobody”访问。
还检查文件夹/home/myname/httpdocs/files/
的权限。 +x
用户的文件夹应为www-data
:
$ mkdir blah
$ echo works > blah/response.bin
$ chmod 000 blah/
$ cat blah/response.bin
cat: blah/response.bin: Permission denied
$ chmod +x blah/
$ cat blah/response.bin
works
您可以通过执行以下操作从等式中删除Apache / your-script:
you:~$ sudo su - www-data
www-data:~$ file /home/myname/httpdocs/files/response.bin
(su可能不起作用,具体取决于您使用的OS /发行版,例如OS X阻止您以www
用户身份登录)
除了文件权限,为什么脚本依赖于您的主文件夹中的文件?可以将response.bin
移动到与Python脚本相同的文件夹中吗?或者甚至可能搬进了数据库? (也许SQLite?可能是不必要的/过度的,取决于response.bin
中的内容以及它的变化)