Отказано в доступе при попытке записи в файл из представления - PullRequest
4 голосов
/ 08 ноября 2011

Я создал чат для этого вопроса: здесь

У меня есть представление, которое пытается выполнить f = open('textfile.txt', 'w'), но на моем работающем сервере это вызывает ошибку [Errno 13] Permission denied: 'textfile.txt'.

Моя файловая структура выглядит следующим образом:

- root
    |
    - project
          |
          - app
          |
          - media

где представление живет в app.

Я пытался использовать textfile.txt в реальном времени в корневом каталоге, проекте, приложении и носителе, каждый из которых имеет 777 разрешений для файлов (владелец, группа и общедоступные пользователи могут читать, писать и выполнять) [* 1].

Если я изменю команду на разрешение на чтение, т.е. f = open('textfile.txt', 'r'), я получу ту же ошибку.

Мой корень мультимедиа установлен на os.path.join(os.path.dirname(__file__), 'media').replace('\\','/') и все это работает на сервере apache через webfaction.

Итак, у меня два вопроса. Откуда django / python пытается открыть этот файл? и что мне нужно изменить, чтобы получить разрешение на открытие и запись в файл.

[* 1] Я знаю, что это не очень хорошая идея, у меня просто есть этот набор для текущих целей отладки.


EDIT:

Я не знаю, относится ли это к делу, но теперь, когда я изменяю его на f = open(os.path.join(settings.MEDIA_URL, 'textfile.txt'), 'r') вместо f = open(os.path.join(settings.MEDIA_URL, 'textfile.txt'), 'w'), я получаю ошибку [Errno 2] No such file or directory.

Я не знаю, имеет ли это смысл или нет ...

1 Ответ

4 голосов
/ 08 ноября 2011

Учитывая следующее:

f = open('textfile.txt', 'w')

Это должен создавать файл в том же каталоге, что и __file__, текущий запущенный скрипт или views.py в вашем сценарии.

Однако лучше быть явным и, следовательно, исключать любые потенциальные отклонения. Я бы порекомендовал изменить эту строку на:

import os
f = open(os.path.join(os.path.dirname(__file__), 'textfile.txt'), 'w')

Или даже лучше, что-то вроде:

import os
from django.conf import settings
f = open(os.path.join(settings.MEDIA_ROOT, 'textfile.txt'), 'w')

Затем вы всегда уверены точно , где файл сохраняется, что должно позволить вам более соответствующим образом оптимизировать ваши разрешения. Кроме того, вы можете использовать PROJECT_ROOT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...