1

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() を使用すると、ファイルが存在しないというエラーが表示されます (ファイルが存在することを何十回も確認したにもかかわらず)。これは、相対および絶対ファイルパスを使用している場合に発生します。

2 つの質問があります。

  • open() が正しいファイルを見つけられないのはなぜですか?
  • ファイルシステムからファイルを返す最良の方法は何ですか? (mod_python を使用してファイルを返すためのより良い方法を見逃していないことを確認してください。)

ありがとう

編集: このスレッドを見つけた後: http://www.programmingforums.org/thread12384.html ファイルを家の外の別のディレクトリに移動すると、open() が機能することがわかりました (/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

2 に答える 2

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に切り替えることをお勧めします。

于 2009-04-28T01:16:48.957 に答える
0

発生したエラーを貼り付けてもらえますか?

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

フォルダの権限/home/myname/httpdocs/files/も確認してください。フォルダはユーザー+x用である必要がありwww-dataます:

$ 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

(使用しているOS /ディストリビューションによっては、suが機能しない場合があります。たとえば、OS Xではwwwユーザーとしてのログインができません)

ファイルのアクセス許可はさておき、スクリプトがホームフォルダ内のファイルに依存しているのはなぜですか?response.binPythonスクリプトと同じフォルダに移動できますか?または、データベースに移動した可能性もありますか?(おそらくSQLite?何が入っresponse.binているか、どれだけ変化するかによっては、不要/過剰になる可能性があります)

于 2009-04-28T01:27:47.587 に答える