Django/Whitenoise 收集静态导致权限被拒绝错误

问题描述 投票:0回答:1

我已经为此苦苦挣扎了好几个星期,并且碰壁了。我正在尝试部署 Django 应用程序,并使用 Whitenoise 来处理静态数据。当我运行collectstatic时,我收到“权限被拒绝”错误。 如何运行collectstatic以便它可以在没有权限问题的情况下运行。 Django 安装在 virtualenv 中,因此无法通过 sudo 运行它。

当DEBUG为True或False时,无论我使用Whitenoise STATICFILES_STORAGE还是Django版本,使用Whitenoise使用collectstatic处理静态文件时都会发生错误。

$ 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'”  

设置.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时,我都会收到不同文件的权限错误。有谁知道如何解决这个问题吗?

让collectstatic与Whitenoise一起工作的最佳方法是什么,或者如何解决这些权限错误? 谢谢

我尝试手动设置文件夹和文件的权限,然后再次重新运行collectstatic,但每次使用新文件时都会失败并出现权限错误,并且需要执行数千次才能完成所有操作。

尝试了 Django 和 Whitenoise 的 STATICFILES_STORAGE 的所有变体

尝试使用 DEBUG=False 和 DEBUG=True

django permissions django-staticfiles whitenoise collectstatic
1个回答
0
投票

嘿兄弟,不用惊慌。 我们来做吧。

  1. 首先,您必须拥有最新版本的 pip,这是更新它的链接 https://pip.pypa.io/en/stable/installation/
  2. 对您的
    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 文件。要启用静态文件加载,请在 HTML 文件顶部包含
{% load static %}
并在 head 标签中添加 css 链接作为
<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

© www.soinside.com 2019 - 2024. All rights reserved.