如何在mod_python中打开和传输文件系统上的文件?
我是mod_python和Apache新手,在GET请求后将文件返回给用户时遇到问题。我现在有一个非常简单的设置,希望只需打开文件并将其写入响应:如何在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(
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返回文件。)
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操作系统的权限)