我已经为此苦苦挣扎了好几个星期,并且碰壁了。我正在尝试部署 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
嘿兄弟,不用惊慌。 我们来做吧。
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')
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