当我将 Django 应用程序部署到 Heroku 时,为啥 collectstatic 不会自动运行?
Posted
技术标签:
【中文标题】当我将 Django 应用程序部署到 Heroku 时,为啥 collectstatic 不会自动运行?【英文标题】:Why isn't collectstatic being run automatically when I deploy my Django app to Heroku?当我将 Django 应用程序部署到 Heroku 时,为什么 collectstatic 不会自动运行? 【发布时间】:2013-10-25 03:24:28 【问题描述】:我关注了官方Heroku docs on Django and Static Assets;我已经安装了dj-static
并将其添加到我的requirements.txt
文件中,正确配置了我的settings.py
文件中的所有变量:
STATIC_ROOT = os.path.join(CONFIG_ROOT, 'served/static/')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(CONFIG_ROOT, 'static'),
)
这就是我的wsgi.py
的样子:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_django_project.settings")
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
Procfile
的内容:
web: gunicorn --bind 0.0.0.0:$PORT my_django_project.wsgi:application
在文档中,它说“collectstatic 在正确配置后会自动运行”。但是当我导航到我的网站时,显然没有 css。
我已经尝试使用heroku run
使用debugging,但这只是按预期复制静态文件。
我注意到当我在Procfile
中包含collectstatic
命令时,即
web: python my_django_project/manage.py collectstatic --noinput ; gunicorn -b 0.0.0.0:$PORT my_django_project.wsgi:application
...按预期工作,并提供静态文件。
但奇怪的是,当我运行heroku run bash
并查看STATIC_ROOT
指向的目录时,那里什么都没有!事实上,整个served/
目录都丢失了,但静态文件仍在提供中!
我仍然想知道为什么collectstatic
没有自动运行——就像文档中提到的那样——当我将我的 Django 应用程序部署到 Heroku 时。
【问题讨论】:
查看***.com/a/15858757/263989 @fasouto 试过了;没有收到任何错误。最后我收到了一堆Pretend to copy '...'
和284 static files copied.
消息。
【参考方案1】:
看起来您可能正在为 Heroku/production 使用特定的设置模块。此外,您已将环境变量 DJANGO_SETTINGS_MODULE
设置为指向此设置模块(这样,当应用程序运行时,Django 知道使用该设置模块,而不是默认/开发模块)。最后,您可能已经在 Heroku/production 设置模块中配置了静态资产设置(可能是STATIC_ROOT
)。
好的,如果这一切都正确,那么问题来了:heroku 环境变量仅在服务时设置,而不是在编译时设置。这很重要,因为 collectstatic
是 Heroku 的编译时操作。 (当您推送时,Heroku 经历了 2 个阶段:1)编译,包括设置应用程序(collectstatic
、syncdb
等)2)服务,您的应用程序的正常运行)。
因此,基本上,您已正确完成所有操作,但 Heroku 并未将您的环境变量(包括您对不同设置模块的规范)暴露给 collectstatic
。
要将环境变量设置为编译时,请启用 Heroku 的 user-env-compile
实验室功能,如下所示:
heroku labs:enable user-env-compile
我认为默认情况下这样做很愚蠢,并且有兴趣了解 Heroku 为何认为这是一个好主意。
【讨论】:
仅供参考,这不再是一个有效的解决方案:(***.com/questions/22904959/…【参考方案2】:您是否尝试将user_env_compile
设置添加到您的heroku 配置中?
heroku labs:enable user-env-compile
启用 collectstatic 后,无论何时自动部署到 heroku,都应该运行。
【讨论】:
【参考方案3】:我将heroku python buildpack 与dokku 一起使用,但collectstatic 没有运行,因为它没有执行 权限。他们在 recent commit(2013 年 12 月 13 日)中修复了这个问题,所以它现在应该可以工作了。
【讨论】:
以上是关于当我将 Django 应用程序部署到 Heroku 时,为啥 collectstatic 不会自动运行?的主要内容,如果未能解决你的问题,请参考以下文章
使用docker将django应用程序部署到heroku时在哪里运行collectstatic?
Django/Celery 和 CloudAMQP/Heroku 的连接错误
当我当时在 Heroku 中部署 django 应用程序时,出现“Compiled Slug Size is too Large”错误