[英]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()時,我收到錯誤,說該文件不存在(即使我已經檢查了十幾次它)。 使用相對和絕對文件路徑時會發生這種情況。
我有兩個問題:
謝謝
編輯:找到這個帖子后: 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.