Django/Whitenoise collectstatic вызывает ошибку Permission Denied

Я боролся с этим несколько недель и уперся в кирпичную стену. Я пытаюсь развернуть приложение Django и использую Whitenoise для обработки статических данных. Когда я запускаю collectstatic, я получаю ошибку «Permissions Denied». Как мне запустить collectstatic, чтобы он мог работать без проблем с разрешениями. Django установлен в virtualenv, так что запуск его как sudo не работает.

Ошибка возникает при использовании Whitenoise для обработки статических файлов с помощью collectstatic, когда значение DEBUG равно True или False и независимо от того, использую ли я Whitenoise STATICFILES_STORAGE или версию для Django.

$ python3 manage.py collectstatic   
“ File "/home/artillery/a1_lounge/web_dev/webdesign_biz/Portfolio/React/Vite/django/.venv/lib/python3.10/site-packages/django/core/files/storage/filesystem.py", line 106, in _save
    fd = os.open(full_path, self.OS_OPEN_FLAGS, 0o666)
PermissionError: [Errno 13] Permission denied: '/home/artillery/a1_lounge/web_dev/webdesign_biz/Portfolio/React/Vite/django/hotdog/staticfiles/admin/js/admin/RelatedObjectLookups.js'”  

settings.py

INSTALLED_APPS = [
    'hotdog_app',
    'corsheaders',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'whitenoise.runserver_nostatic', # Whitenoise serves static in Dev and Prod
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # Enable Whitenoise
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"

Обычно при создании файла предоставляются стандартные разрешения, например

(.venv) $ touch test.txt  
-rw-rw-r--  1 artillery artillery    0 Nov  8 13:00 text.txt  

При первом запуске collectstatic

(.venv) $ python3 manage.py collectstatic  
PermissionError: [Errno 13] Permission denied: '/home/artillery/a1_lounge/web_dev/courses/CS50/Project-1/wiki/staticfiles/admin/js/vendor/select2/i18n/ne.js'  

Создана папка staticfiles без доступа на чтение и заблокирована

d-wx-wx-wT  7 artillery artillery 4.0K Nov  8 12:49 staticfiles  

Все файлы, созданные в папке staticfiles, заблокированы и созданы с очень ограниченными правами

--w --- -r-T  1 artillery artillery  12K Nov  8 12:49 staticfiles.json  

Затем я выполнил следующие команды, установив разрешения вручную

(.venv) $ sudo find staticfiles -type d -exec chmod 775 {} +  
(.venv) $ sudo find staticfiles -type f -exec chmod 665 {} +  

Это установит правильные разрешения, но каждый раз, когда я запускаю collectstatic, я получаю ошибку Permissions error для другого файла. Кто-нибудь знает, как это исправить?

Каким способом лучше всего заставить collectstatic работать с Whitenoise или как обойти эти ошибки разрешения? Спасибо

Я пробовал устанавливать права доступа к папкам и файлам вручную, а затем снова запускать collectstatic, но он терпит неудачу с ошибкой Permission Error каждый раз, когда появляется новый файл, и нужно сделать это тысячи раз, чтобы просмотреть их все.

Перепробовал все варианты STATICFILES_STORAGE для Django и Whitenoise

Пробовали с DEBUG=False и DEBUG=True

Эй, брат, не надо паниковать. Давай сделаем это.

  1. Прежде всего, у вас должна быть последняя версия pip, и вот ссылка для ее обновления https://pip.pypa.io/en/stable/installation/
  2. .
  3. Внесите следующие изменения в ваш settings.py файл.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent

INSTALLED_APPS = [
    'whitenoise.runserver_nostatic', # put it at the top
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # applications are always at the bottom
    'hotdog_app',
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # put it at the bottom
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
  1. Запустите эту команду, чтобы автоматически создать папку staticfiles, а это python manage.py collectstatic.

В папке staticfiles вы найдете две основные подпапки: папку admin, которую можно удалить, если вы не используете панель администратора, и папки, названные в честь каждого из ваших приложений. В эти папки вы можете добавить столько CSS- и JavaScript-файлов, сколько потребуется. Чтобы включить загрузку статических файлов, включите {% load static %} в верхнюю часть HTML-файла и добавьте ссылку на css в тег head как <link rel="stylesheet" href="{% static 'test_app/css/custom.css' %}">, если вы хотите добавить ссылку на js, вы можете сделать это как <script type="module" src="{% static 'test_app/js/main.js' %}"></script>.

Кроме того, не могли бы вы уточнить, планируете ли вы развернуть свое приложение на Vercel или на другой платформе? Большинство платформ используют схожий процесс управления статическими файлами, но важно быть в курсе всех специфических требований платформы на случай возникновения проблем. Для получения более подробной информации о настройке WhiteNoise обратитесь к официальной документации https://whitenoise.readthedocs.io/en/stable/django.html

Вернуться на верх