2011-11-07 4 views
4

Я создал чат на этот вопрос: hereОтказано в доступе при попытке записи в файл с целью

У меня есть мнение, что попытки выполнить 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') Я получаю ту же ошибку.

My media root установлен в 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.

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

+0

Вы пытались пойти с консолью python и попытаться записать в файл? – balsagoth

+0

yep, без проблем записывать файл из 'manage.py shell'. Обратите внимание, когда я пишу в файл, он находит его в каталоге проекта. –

+0

и пользователь, которому принадлежит процесс веб-сервера, тот же, что и вы пытались сделать 'manage.py shell' – balsagoth

ответ

3

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

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.

+1

Это помогает немного сузить его, но все разрешения на путь к моему медиа-каталогу установлены, и я все еще запутался в ошибке. Это заставляет меня думать, что это может иметь отношение к моему WSGI-скрипту, поскольку я могу записать его в файл из оболочки python. –

+0

Этот ответ в значительной степени решил мою проблему, просто убедитесь, что вы используете MEDIA_ROOT, а не MEDIA_URL. Я отредактирую ваш ответ и приму его после утверждения. –

+0

Вправо. Сожалею. Там был мозговой судорог. –

Смежные вопросы