Установка правильных прав на сгенерированный zip-файл в Django - PullRequest
7 голосов
/ 01 мая 2011

Я использую Django и Python2.6 для создания zip-файла пользовательских шаблонов Django для каждого пользователя, чтобы загрузить специальный zip файл.На данный момент код в views.py выглядит следующим образом:

def download(request):
    response = HttpResponse(mimetype='application/x-zip-compressed')
    response['Content-Disposition'] = 'attachment; filename=download.zip'

    myzip = zipfile.ZipFile(response, 'w')

    now = datetime.datetime.now()
    zipInfo = zipfile.ZipInfo('thefile.txt', (now.year, now.month, now.day, now.hour, now.minute, now.second))
    myzip.writestr(zipInfo, render_to_string('template.txt', locals(), context_instance=RequestContext(request)))
    myzip.close()

    return response

В основном, это работает нормально: zip-файл (содержащий один txt файл в этом примере) загружен правильно, и яможете извлечь содержимое.Однако единственная проблема заключается в том, что разрешения для сгенерированного файла не являются ни read, ни write для моего пользователя по умолчанию, как и для пользователей моего веб-сайта.

Как изменить разрешения автоматически сгенерированного файла перед загрузкой?

Обновление :

У меня естьпопытался использовать os.chmod и os.fchmod, как предложено Майком, но это либо требует имя пути (которого у меня нет), либо выдает ошибку (для fchmod):

ZipFile instance has no attribute '__trunc__'

Один из вариантов, я полагаю, состоял бы в том, чтобы сначала сохранить zip-файл, установить разрешения, а затем разрешить загрузку, но это кажется излишним - должен быть лучший способ преодоления этой простой проблемы.У кого-нибудь есть какие-либо предложения или идеи?

Update2 :

Кажется, эта проблема ограничена системами Unix, так как она отлично работает в Windows и(видимо) OS X. Есть похожая тема, которую я нашел здесь .Насколько я могу судить, это должно быть связано с методом writestr.Как установить разрешения для файла, добавляемого в zip-файл, с помощью writestr?

Ответы [ 2 ]

4 голосов
/ 03 мая 2011

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

zk@fool:~/Downloads% ls -l | grep thefile
-rwxr-xr-x@  1 zk  staff           9 May  3 06:37 thefile.txt*

Хорошо работает для меня с Archive Utility на osx, встроенным в Windows zip explorer и 7-zip.Проверка созданных zip-файлов показывает, что у них вообще нет атрибутов.Поэтому я подозреваю, что все, что вы используете для распаковки файла, это просто неправильная установка разрешений.

Вы можете попробовать установить ZipInfo.external_attr:

zipInfo.external_attr = 0777 << 16L # set permissions on file

, похоже, исправить разрешения в системе linux:

zk@arch:~% ls -l | grep thefile
-rwxrwxrwx  1 zk     9 May  3 07:06 thefile.txt*
0 голосов
/ 03 мая 2011

В Unix каждый процесс имеет маску прав доступа к файлу по умолчанию. Читайте дальше:
umask
попробуйте установить его для процесса django.

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