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
Эй, брат, не надо паниковать. Давай сделаем это.
- Прежде всего, у вас должна быть последняя версия pip, и вот ссылка для ее обновления https://pip.pypa.io/en/stable/installation/ .
- Внесите следующие изменения в ваш
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')
- Запустите эту команду, чтобы автоматически создать папку 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