Как открыть и перенести файл в файловую систему в mod_python? - PullRequest
1 голос
/ 28 апреля 2009

Я новичок в 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 (), говоря, что файл не существует (хотя я проверил дюжину раз, что он существует). Это происходит при использовании относительных и абсолютных путей к файлам.

У меня два вопроса:

  • Почему не открывается () найти правильный файлы
  • Каков наилучший способ вернуть файл из файловой системы? (Прошу сделать уверен, что я не пропустил какой-то лучший способ использовать 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'

Ответы [ 2 ]

4 голосов
/ 28 апреля 2009

Чтобы отладить подобные вещи, вам нужно собрать всю информацию из запущенного экземпляра 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 голосов
/ 28 апреля 2009

Не могли бы вы вставить полученную ошибку (я)?

Вероятно, это ошибка разрешения (если вы пытались использовать полный путь к файлу). Помните, что скрипт запускается как пользователь, выполняющий процесс веб-сервера - поэтому вы будете обращаться к файлу как «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

(su может не работать, в зависимости от используемой ОС / дистрибутива, например, OS X запрещает вход в систему как пользователь www)

Помимо прав доступа к файлу, почему скрипт все равно зависит от файла в вашей домашней папке? Может ли response.bin быть перемещен в ту же папку, что и ваш скрипт Python? Или, возможно, даже перешел в базу данных? (возможно, SQLite? Может быть ненужным / чрезмерным, в зависимости от того, что находится в response.bin и насколько оно меняется)

...