Как указать права доступа к файлам FileBasedCache
Я использую Django 3, Nginx, uWSGI
Мой обычный Django Web/HTTP сервер создает и читает различные файлы кэша, используя FileBasedCache
под /var/tmp/django_cache/
. Пока все это работает отлично...
Nginx и uwsgi работают от имени пользователя www-data
. Поэтому различные файлы кэша и подкаталоги в каталоге django_cache принадлежат пользователю и группе www-data. Однако у меня также есть другой пользователь: website
, которого я использую для запуска различных команд manage.py, выполнения действий из cron и т.д. Пользователь website
входит в группу www-data
, так что обычно это работает совершенно нормально.
Моя проблема заключается в том, что я пишу управляющий скрипт (который запускается пользователем website
, а не www-data
), которому нужно получить доступ к некоторым кэшированным файлам, которые были созданы пользователем www-data
, и поскольку Django создает эти файлы как
-rw------- 1 www-data www-data
мой website
пользователь не может их прочитать, и это создает исключение.
Я пробовал:
- добавление
session optional pam_umask.so umask=0137
в файлы конфигурацииcommon-session
иcommon-session-interactive
pam. - добавление
umask = 0137
в файл конфигурации приложения uWSGI сайта
Я считаю, что оба этих изменения/настройки "работают" в том смысле, что если я делаю тест, чтобы сказать django записать произвольный файл в /var/tmp/
, он делает это с правильными разрешениями, однако Django's FileBasedCache продолжает записывать только те файлы кэша, которые доступны для чтения и записи только пользователю www-data.
Я просмотрел функцию cache/backends/filebased.py
set()
- которая, похоже, является местом, где файлы фактически записываются на диск - и я не вижу способа указать/отменить разрешения по умолчанию, согласно которым каталоги и файлы создаются как 660
(чтение и запись пользователем и группой www-data
).
У меня два вопроса:
- Почему при записи моего тестового файла создаются файлы с разными разрешениями по сравнению с разрешениями Django
FileBasedCache
set()
?
Другими словами: для моего "теста" я сделал очень простой
with open("/var/tmp/django_cache/test", 'w') as f:
f.write("test!")
в быстром небольшом веб-просмотре, и это создает файл с правильными разрешениями (как я и ожидал...)
Однако Django's FileBasedCache set(), похоже, делает по сути то же самое:
with open(fd, 'wb') as f:
self._write_content(f, timeout, value)
другими словами, он не указывает разрешения, нет настройки umask и т.д...
Почему мой тест open/write дает результат, отличный от того, что делает Django? Он также выполняется из веб-системы nginx/uwsgi/django (а не из команды управления), так почему же результат отличается?
- И второе; как решить эту проблему! Нужно ли мне расширить класс FileBasedCache, использовать его вместо этого и переопределить функцию set()? Это кажется слишком сложным для того, что должно быть простой проблемой. Почему функция set() кэша Django не создает временные файлы с правильными разрешениями?
- запустите uwsgi в качестве
website
пользователя .
- переключитесь на какую-либо другую форму кэширования (redis и т.д.)
Буду признателен за любое понимание!
О, две вещи, которые я рассматривал, но действительно не хочу делать, из-за того, сколько дополнительной работы/изменений/тестирования это повлечет за собой: