Как указать права доступа к файлам 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-interactivepam. - добавление
umask = 0137в файл конфигурации приложения uWSGI сайта
Я считаю, что оба этих изменения/настройки "работают" в том смысле, что если я делаю тест, чтобы сказать django записать произвольный файл в /var/tmp/, он делает это с правильными разрешениями, однако Django's FileBasedCache продолжает записывать только те файлы кэша, которые доступны для чтения и записи только пользователю www-data.
Я просмотрел функцию cache/backends/filebased.py set() - которая, похоже, является местом, где файлы фактически записываются на диск - и я не вижу способа указать/отменить разрешения по умолчанию, согласно которым каталоги и файлы создаются как 660 (чтение и запись пользователем и группой www-data).
У меня два вопроса:
- Почему при записи моего тестового файла создаются файлы с разными разрешениями по сравнению с разрешениями Django
FileBasedCacheset()?
Другими словами: для моего "теста" я сделал очень простой
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 и т.д.)
Буду признателен за любое понимание!
О, две вещи, которые я рассматривал, но действительно не хочу делать, из-за того, сколько дополнительной работы/изменений/тестирования это повлечет за собой: