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

如何在mod_python中打开和传输文件系统上的文件?,python,file-io,mod-python,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(

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

我有两个问题:

  • 为什么open()找不到正确的 档案
  • 返回文件的最佳方式是什么 从文件系统?(我要求作出决定 当然我没有错过更好的方法 使用mod_python返回文件。)
谢谢

编辑:找到这个线程后:我发现如果我将文件移动到home之外的另一个目录,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'

要调试这种东西,您需要从运行的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_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。如果您的文件没有被所有人读取,并且不在正确的目录中,您将遇到问题

您可能想切换到。

您能粘贴得到的错误吗

可能是权限错误(如果您尝试使用文件的完整路径)。请记住,脚本是以运行web服务器进程的用户的身份运行的,因此您通常会以“www数据”或“无人”的身份访问文件

还要检查文件夹
/home/myname/httpdocs/files/
的权限。对于
www-data
用户,文件夹应为
+x

$ 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/脚本:

you:~$ sudo su - www-data
www-data:~$ file /home/myname/httpdocs/files/response.bin
(su可能无法工作,具体取决于您使用的操作系统/发行版,例如OS X阻止您以
www
user身份登录)

撇开文件权限不谈,为什么脚本仍然依赖于主文件夹中的文件?能否将
response.bin
移动到与Python脚本相同的文件夹中?或者甚至可能移动到数据库中?(可能SQLite?可能是不必要的/过多的,这取决于
response.bin中的内容以及它的变化量)

您能粘贴得到的错误吗

可能是权限错误(如果您尝试使用文件的完整路径)。请记住,脚本是以运行web服务器进程的用户的身份运行的,因此您通常会以“www数据”或“无人”的身份访问文件

还要检查文件夹
/home/myname/httpdocs/files/
的权限。对于
www-data
用户,文件夹应为
+x

$ 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/脚本:

you:~$ sudo su - www-data
www-data:~$ file /home/myname/httpdocs/files/response.bin
(su可能无法工作,具体取决于您使用的操作系统/发行版,例如OS X阻止您以
www
user身份登录)


撇开文件权限不谈,为什么脚本仍然依赖于主文件夹中的文件?能否将
response.bin
移动到与Python脚本相同的文件夹中?或者甚至可能移动到数据库中?(也许SQLite?可能是不必要的/过度的,这取决于
response.bin中的内容以及它的变化程度)

在找到了关于发生了什么的线索后,我更新了我的问题。我也尝试了你的建议,发现了一些有趣的factoid:mod_python作为“www data”运行,并且没有“/”了。在找到了关于发生了什么的线索之后,我更新了我的问题。我也尝试了你的建议,发现了一些有趣的factoid:mod_python作为“www data”运行,并且没有“/”了。我在我的问题上粘贴了大部分错误。然而,我尝试过将文件打包到www数据,但没有成功。(也许我误解了Unix操作系统的权限)我在问题上粘贴了大部分错误。然而,我尝试过将文件打包到www数据,但没有成功。(不过,也许我误解了Unix操作系统的权限)