静态文件在生产中不起作用。
Cloudinary 和 Django settings.py 和 templates 设置正确。
检查 Cloudinary 上的媒体库,项目中的所有内容都已正确更新并且可以查看。另一种查看方式是使用此表。
生产阶段 | 结果 |
---|---|
Django 项目发送静态文件到 Cloudinary 的媒体库 | 完全按照预期工作 |
Django 部署到 Heroku | 完全按照预期工作(Cloudinary 除外) |
Cloudinary 向 Heroku 提供静态文件 | 未按预期工作,页面源表明与 herokuapp 和 cloudinary 混淆。 |
<link rel="stylesheet" href="{% static 'css/style.css' %}">
在本地主机中,这成功定向到静态文件localhost:8000/static/css/style.css
在生产中,这就是我们遇到麻烦的地方。没有 CSS,同一行代码如下:
<link rel="stylesheet" href="[/static/css/style.css](https://coach-matrix-d2cd1e717f81.herokuapp.com/static/css/style.css)"> <!-- this is a 404 empty link, should loads static files from cloudinary, not herokuapp, should lead to an URL like https://res.cloudinary.com/dh1xovduy/raw/upload/v1703781479/static/css/style.674a1e0f7f03.css -->
当我检查同行正在运行的开源项目的页面源代码时,它运行得很好。
本地主机:
<link rel="stylesheet" href="{% static 'css/style.css' %}">
生产中:
<link rel="stylesheet" href="https://res.cloudinary.com/ksjl86/raw/upload/v1/static/css/style.574ae5e833b9.css">
虽然我也遇到了 django-quill-editor 的问题,但我现在正在检查 CSS,因为可能更容易解决。我有一个临时工作解决方案,可以直接链接到整个 cloudinary URL ,但现在已进行编辑,以便我可以进一步检查页面源
让 css 成功显示的唯一临时解决方法如下
<link rel="stylesheet" href="https://res.cloudinary.com/dh1xovduy/raw/upload/v1703781479/static/css/style.674a1e0f7f03.css"> <!--linking directly to the file and now works successfully-->
但是这个解决方案并不理想,因为它仍然给其他静态文件(例如 django-quill)留下问题。
使用 django_quill 时,我也遇到了在 Herokuapp 而不是 cloudinary 上请求错误文件路径的问题。
如前所述,django settings.py STATIC_ROOT 等都工作正常,已经过多个同行的审查,不需要进一步审查。它还使用collectstatic正确上传。问题肯定是在 Cloudinary 和 Heroku 之间。
据我所知,设置是正确的,请参见下文[使用已编辑的凭据。]
CLOUDINARY_URL=cloudinary: [REDACTED URL IS HERE]
DATABASE_URL=postgres: // [REDACTED URL HERE]
DISABLE_COLLECTSTATIC=0
PORT=8000
SECRET_KEY= [REDACTED KEY IS HERE]
从我在文档中阅读的所有内容来看,这是正确的设置。我还咨询了同行的开源存储库,他们的工作正常,但是我们将在下一节中看到他们的确实成功链接到 herok。
我的settings.py 的格式与我的同行在cloudinary 设置方面的格式完全相同。为了优雅和可读性,我将撤回完整的代码摘录,但提供指向我的 settings.py 的链接here.
我完全相信我的settings.py 工作正常。
Procfile 读取为
web: gunicorn coachmatrix.wsgi
release: python manage.py collectstatic --noinput
正如预期的那样,Heroku 随后确认了来自 cloudinary 的静态文件,
0 static files copied, 1386 post-processed.
尝试将 settings.py 中的第 192 行从
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
更改为 STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
这是一个元组,并且逗号很重要
我确信 Heroku 中的配置变量导致了问题。我尝试在第二列中使用正确的密钥输入这些详细信息(在视图中隐藏)所有这些都会导致与描述相同的问题。
CLOUDINARY_URL
DATABASE_URL
DISABLE_COLLECTSTATIC PORT SECRET_KEY
CLOUDINARY_API_KEY
CLOUDINARY_API_SECRET
CLOUDINARY_CLOUD_NAME
CLOUDINARY_URL
DATABASE_URL
DISABLE_COLLECTSTATIC
PORT
SECRET_KEY
CLOUDINARY_API_KEY
CLOUDINARY_API_SECRET
CLOUDINARY_CLOUD_NAME
CLOUDINARY_URL
DATABASE_URL
PORT
SECRET_KEY
CLOUDINARY_API_KEY
CLOUDINARY_API_SECRET
CLOUDINARY_CLOUD_NAME
DATABASE_URL
PORT
SECRET_KEY
发现该问题与缺少 Whitenoise 中间件有关,这是一个 Python 包,特别适合简化静态文件并让它们在部署的 Web 应用程序中提供服务。
尽管最初存在一些担忧,但 Cloudinary 或 Heroku 一直运行良好,并且可以通过一个非常简单的解决方案在代码存储库内部进行修复。
这是修复方法。
pip install whitenoise
在终端whitenoise==6.6.0
添加到 requirements.txt
settings.py
更新中间件MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # added whitenoise middleware here.
'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',
'allauth.account.middleware.AccountMiddleware',
]
感谢代码学院校友社区的 Sean Mead 找到了拼图中的最后一块。