【问题标题】:How do you open and transfer a file on the filesystem in mod_python?如何在 mod_python 中打开和传输文件系统上的文件?
【发布时间】:2009-04-28 00:53:59
【问题描述】:

我是 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 返回文件。)

谢谢

编辑:找到这个线程后:http://www.programmingforums.org/thread12384.html 我发现如果我将文件移动到家庭以外的另一个目录,open() 对我有用(我是 /home/myname/httpdocs 的别名,但如果我使用/数据)。任何想法为什么有效?

编辑 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'

【问题讨论】:

    标签: python file-io mod-python


    【解决方案1】:

    要调试这种东西,你需要从正在运行的 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

    【讨论】:

    • 我在找到关于发生了什么的线索后更新了我的问题。我也尝试了你的建议,发现了一些有趣的事实:mod_python 运行为“www-data”,并且用完了“/”。
    【解决方案2】:

    你能粘贴你得到的错误吗?

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

    还要检查文件夹/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/your-script:

    you:~$ sudo su - www-data
    www-data:~$ file /home/myname/httpdocs/files/response.bin
    

    (su 可能不起作用,具体取决于您使用的操作系统/发行版,例如 OS X 会阻止您登录,因为它是 www 用户)

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

    【讨论】:

    • 我已将大部分错误粘贴到我的问题中。但是,我尝试将文件添加到 www-data 但没有成功。 (不过,也许我误解了 Unix 操作系统的权限)
    猜你喜欢
    • 2016-03-19
    • 2010-10-13
    • 1970-01-01
    • 2021-08-03
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2017-05-15
    相关资源
    最近更新 更多