Как указать права доступа к файлам 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).

У меня два вопроса:

  1. Почему при записи моего тестового файла создаются файлы с разными разрешениями по сравнению с разрешениями 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 (а не из команды управления), так почему же результат отличается?

  1. И второе; как решить эту проблему! Нужно ли мне расширить класс FileBasedCache, использовать его вместо этого и переопределить функцию set()? Это кажется слишком сложным для того, что должно быть простой проблемой. Почему функция set() кэша Django не создает временные файлы с правильными разрешениями?
  2. Буду признателен за любое понимание!

    О, две вещи, которые я рассматривал, но действительно не хочу делать, из-за того, сколько дополнительной работы/изменений/тестирования это повлечет за собой:

    • запустите uwsgi в качестве website пользователя
    • .
    • переключитесь на какую-либо другую форму кэширования (redis и т.д.)
    Вернуться на верх