在生产中,django {% static 'file/path' %} 命令在 Herokuapp 上查找文件路径,而它应该通过 Cloudinary 查找

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

静态文件在生产中不起作用。

问题领域总结

经过严格审查和同行比较后,

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 之间。

检查heroku配置变量,使用DISABLE_COLLECTSTATIC=0

据我所知,设置是正确的,请参见下文[使用已编辑的凭据。]

CLOUDINARY_URL=cloudinary: [REDACTED URL IS HERE]

DATABASE_URL=postgres: // [REDACTED URL HERE]

DISABLE_COLLECTSTATIC=0

PORT=8000

SECRET_KEY= [REDACTED KEY IS HERE]

检查设置.py

从我在文档中阅读的所有内容来看,这是正确的设置。我还咨询了同行的开源存储库,他们的工作正常,但是我们将在下一节中看到他们的确实成功链接到 herok。

我的settings.py 的格式与我的同行在cloudinary 设置方面的格式完全相同。为了优雅和可读性,我将撤回完整的代码摘录,但提供指向我的 settings.py 的链接here.

我完全相信我的settings.py 工作正常。

检查heroku和procfile中的部署日志

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"),)
这是一个元组,并且逗号很重要

从 env.py 添加变量

我确信 Heroku 中的配置变量导致了问题。我尝试在第二列中使用正确的密钥输入这些详细信息(在视图中隐藏)所有这些都会导致与描述相同的问题。

版本0

 CLOUDINARY_URL 
DATABASE_URL
DISABLE_COLLECTSTATIC PORT SECRET_KEY

版本1

CLOUDINARY_API_KEY
CLOUDINARY_API_SECRET
CLOUDINARY_CLOUD_NAME
CLOUDINARY_URL
DATABASE_URL
DISABLE_COLLECTSTATIC
PORT
SECRET_KEY

版本2

CLOUDINARY_API_KEY
CLOUDINARY_API_SECRET
CLOUDINARY_CLOUD_NAME
CLOUDINARY_URL
DATABASE_URL
PORT
SECRET_KEY

版本3

CLOUDINARY_API_KEY
CLOUDINARY_API_SECRET
CLOUDINARY_CLOUD_NAME
DATABASE_URL
PORT
SECRET_KEY
heroku static cloudinary django-staticfiles collectstatic
1个回答
0
投票

发现该问题与缺少 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 找到了拼图中的最后一块。

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