2009-04-28 12 views
1

私はmod_pythonとApacheを初めて使いました.GETリクエスト後にファイルを返すのに問題があります。私は今、非常に簡単なセットアップを持っている、と単純にファイルを開き、応答にそれを書くために期待していた:私は(オープン使うときmod_pythonのファイルシステム上でファイルを開いて転送するにはどうすればよいですか?

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 

はしかし、私はエラーを取得しています)、と言ってファイルは存在しません(たとえ私が数十回チェックしたとしても)。これは、相対ファイルパスと絶対パスを使用する場合に発生します。

  • なぜオープンされていない() ファイルを右を見つける:

    私は2つの質問を持っていますか?

  • ファイルシステムからファイル を返す最良の方法は何ですか? (私は、ファイルを返すようにmod_pythonのを使用するためにいくつかのより良い方法 が欠落していないよ を確認するために頼む。)

おかげ

編集を:私は開いていることを発見しhttp://www.programmingforums.org/thread12384.html():このスレッドを見つけた後、 (私は/ 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' 

答えて

4

この種のものをデバッグするには、実行中の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に切り替えることができます。

+0

何が起こっているのかのヒントを見つけた後、私の質問を更新しました。また、私はあなたの助言を試み、いくつかの興味深い事実を見つけました:mod_pythonは "www-データ"として実行され、 "/"が不足しています。 –

0

あなたはエラーを貼り付けることができますか?

(ファイルへのフルパスを使用しようとすると)権限エラーが発生する可能性があります。スクリプトはWebサーバープロセスを実行しているユーザーとして実行されるので、通常は「www-data」または「nobody」としてファイルにアクセスします。

フォルダ/home/myname/httpdocs/files/の権限も確認してください。内容に応じて、

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

を(SUが動作しない場合があります:あなたは次の操作を行って、式からApacheの/あなたのスクリプトを排除することができる

$ 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 

:フォルダがwww-dataユーザーに対して+xする必要がありますあなたが使用しているOS /ディストリビューション(例えば、OS Xはあなたのログインを防ぎます。wwwユーザ)

ファイルの権限は別として、あなたのホームフォルダのファイルに依存しているのはなぜですか? response.binはPythonスクリプトと同じフォルダに移動できますか?またはデータベースに移動した可能性もありますか? (たぶんSQLite?response.binの内容によっては不必要/過剰かもしれません。)

+1

私は質問にほとんどのエラーを貼り付けました。しかし、私は成功することなくwww-データにファイルをchowningしようとしました。 (たぶん私はUnix OSの権限を誤解しているかもしれない) –

関連する問題