如何在mod_python中打开和传输文件系统上的文件?

时间:2009-04-28 00:54:00

标签: python file-io mod-python

我是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()时遇到错误,说该文件不存在(即使我已经检查了十几次)。使用相对和绝对文件路径时会发生这种情况。

我有两个问题:

  • 为什么不开放()找到合适的人选 文件?
  • 返回文件的最佳方法是什么 从文件系统? (我要求 确定我没有错过更好的方法 使用mod_python返回文件。)

由于

编辑:找到这个帖子后: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'

2 个答案:

答案 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中的内容以及它的变化)