【问题标题】:Django static files are not loaded when deploying on Heroku using Docker and Whitenoise使用 Docker 和 Whitenoise 在 Heroku 上部署时未加载 Django 静态文件
【发布时间】:2020-09-17 23:02:41
【问题描述】:

我正在尝试在 Heroku 上部署一个 django 应用程序(使用 Whitenoise),除了静态文件外,一切正常。 sample project 只是在首页上显示一个标题“主页”。如果 css 文件加载正确,则标题将显示为红色,否则为黑色。

我让上述项目在virtualenvDocker 容器中工作,带有DEBUG=False,但由于某种原因I could not make it work on Heroku(如果正确加载 CSS,标题将是红色)。

我尝试按照Heroku docs 的建议使用django-heroku,但它开始引发500 服务器错误,并且在检查heroku logs 时它说找不到the css file 的清单,这似乎是因为它设置了STATICFILES_STORAGE 为不同的值。

settingsyml 文件中是否存在错误设置?或者可能是因为我正在部署一个 Docker 文件(而不是 Procfile),我需要使用不同的设置?

更新 1:

按照 cmets 中的建议。我尝试关注this tutorial 中所做的事情,其中​​还做了两件事:

  1. 设置STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
  2. 正在运行heroku plugins:install @heroku-cli/plugin-manifest

执行此操作时,现在我收到不同的 HTTP 500 错误:

/usr/local/lib/python3.7/site-packages/whitenoise/base.py:115: UserWarning: No directory at: /django-heroku-staticfiles/staticfiles/

现在我认为问题很清楚了。所以我开始在 heroku 实例上运行一些命令:

$ heroku run ls -l /django-heroku-staticfiles
Running ls -l /django-heroku-staticfiles on ⬢ evening-lowlands-39080... up, run.5553 (Free)
total 160
-rw------- 1 u35232 dyno    179 May 30 12:21 Dockerfile
-rw------- 1 u35232 dyno 131072 May 30 12:21 db.sqlite3
-rw------- 1 u35232 dyno    235 May 30 12:21 docker-compose.yml
drwx------ 2 u35232 dyno   4096 May 30 12:21 hello_project
-rw------- 1 u35232 dyno    182 May 30 12:21 heroku.yml
-rwx------ 1 u35232 dyno    633 May 30 12:21 manage.py
drwx------ 4 u35232 dyno   4096 May 30 12:21 pages
-rw------- 1 u35232 dyno     93 May 30 12:21 requirements.txt
drwx------ 2 u35232 dyno   4096 May 30 12:21 templates

$ heroku run python manage.py collectstatic --clear --noinput
Running python manage.py collectstatic --clear --noinput on ⬢ evening-lowlands-39080... up, run.9686 (Free)

131 static files copied to '/django-heroku-staticfiles/staticfiles', 413 post-processed.

$ heroku run ls -l /django-heroku-staticfiles
Running ls -l /django-heroku-staticfiles on ⬢ evening-lowlands-39080... up, run.3303 (Free)
total 160
-rw------- 1 u20456 dyno    179 May 30 12:21 Dockerfile
-rw------- 1 u20456 dyno 131072 May 30 12:21 db.sqlite3
-rw------- 1 u20456 dyno    235 May 30 12:21 docker-compose.yml
drwx------ 2 u20456 dyno   4096 May 30 12:21 hello_project
-rw------- 1 u20456 dyno    182 May 30 12:21 heroku.yml
-rwx------ 1 u20456 dyno    633 May 30 12:21 manage.py
drwx------ 4 u20456 dyno   4096 May 30 12:21 pages
-rw------- 1 u20456 dyno     93 May 30 12:21 requirements.txt
drwx------ 2 u20456 dyno   4096 May 30 12:21 templates

为什么没有创建staticfiles?也许我需要通过 Docker 运行命令?抱歉,我是 Docker、Django 和 Heroku 的新手,所以我可能会遗漏一些明显的东西。

【问题讨论】:

  • 我认为 django-heroku 会覆盖您的 STATIC_URLSTATIC_ROOT。您是否尝试过添加STATICFILES_DIRS,这样您就可以明确说出您的文件在哪里?比如:STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ('pages', os.path.join(BASE_DIR, 'pages/static')), )
  • 嗯...将 Django 与 Docker 部署到 Heroku 可能需要额外的步骤。这个(教程)[testdriven.io/blog/deploying-django-to-heroku-with-docker/]还建议添加STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
  • 感谢@OriginalBBQSauce 的链接!本文似乎做了两件额外的事情:1)设置STATICFILES_STORAGE并安装plugin-manifest。我会尝试添加这些并报告。
  • 刚试过这些,现在有一个 500 错误:/usr/local/lib/python3.7/site-packages/whitenoise/base.py:115: UserWarning: No directory at: /django-heroku-staticfiles/staticfiles/ 这是不言自明的。现在的问题是为什么collectstatic 不创建这个目录?再次感谢,我将使用这些详细信息更新问题。
  • 实际上...它正在另一个 staticfiles 中搜索 staticfiles 文件夹。这有点奇怪!

标签: python django docker heroku


【解决方案1】:

感谢@Original BBQ Sauce,这个SO question,和this Reddit post,问题终于解决了。它与我们运行collectstatic 的位置/时间有关。最初我在heroku.yml 文件中将它作为release command 运行,由于某种原因,它没有创建staticfiles 目录。我是这样做的,就像在 Django for Professionals 书中所做的那样。

现在,如果在 Dockerfile 中运行该命令,则会创建 staticfiles 目录和 all should work fine。存储库现在具有新的工作设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2021-06-06
    • 2018-03-08
    • 2017-03-01
    • 2014-06-08
    • 2018-06-02
    • 2015-05-11
    • 2016-04-16
    相关资源
    最近更新 更多