簡體   English   中英

如何在mod_python中打開和傳輸文件系統上的文件?

[英]How do you open and transfer a file on the filesystem in 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()時,我收到錯誤,說該文件不存在(即使我已經檢查了十幾次它)。 使用相對和絕對文件路徑時會發生這種情況。

我有兩個問題:

  • 為什么open()找不到合適的文件?
  • 從文件系統返回文件的最佳方法是什么? (我要確保我沒有錯過使用mod_python返回文件的更好方法。)

謝謝

編輯:找到這個帖子后: http//www.programmingforums.org/thread12384.html我發現如果我將文件移到家外的另一個目錄(我是/ home / myname中的別名),open()對我有用/ 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_wsgi

你能粘貼你得到的錯誤嗎?

它可能是一個權限錯誤(如果您嘗試使用文件的完整路徑)。 請記住,腳本以運行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 /發行版,例如OS X會阻止您以www用戶身份登錄)

除了文件權限,為什么腳本依賴於您的主文件夾中的文件? 可以將response.bin移動到與Python腳本相同的文件夾中嗎? 或者甚至可能搬進了數據庫? (也許SQLite?可能是不必要的/過度的,取決於response.bin以及它的變化程度)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM