当我将Django应用程序部署到Heroku时,为什么不自动运行collectstatic?

时间:2013-10-16 20:25:46

标签: django heroku static-files procfile

我跟随官方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,但这只是按预期复制静态文件。

我注意到当我在collectstatic中加入Procfile命令时,即

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时。

3 个答案:

答案 0 :(得分:4)

看起来您可能正在使用Heroku / production的特定设置模块。此外,您已将环境变量DJANGO_SETTINGS_MODULE设置为指向此设置模块(这样,当应用程序运行时,Django知道使用那个而不是,例如,您的默认/开发模块)。最后,您可能已经在Heroku /生产设置模块中配置了静态资产设置(可能是STATIC_ROOT)。

好的,所以如果这一切都是正确的,那么这就是问题: heroku环境变量只在服务时设置,而不是在编译时设置。这很重要,因为 collectstatic是Heroku的编译时操作。 (当你推动时,Heroku会经历两个阶段:1)编译,包括设置应用程序(collectstaticsyncdb等)2)服务,应用程序的正常运行。)

因此,基本上,您已正确完成所有操作,但Heroku未将您的环境变量(包括您对其他设置模块的规范)公开给collectstatic

要将您的环境变量设置为编译时,请启用Heroku的user-env-compile实验室功能,如下所示:

heroku labs:enable user-env-compile

我认为默认情况下做这件事很愚蠢,并且有兴趣听听为什么Heroku认为这是个好主意。

答案 1 :(得分:1)

您是否尝试将user_env_compile设置添加到heroku配置?

heroku labs:enable user-env-compile

启用后,只要您自动部署到heroku,就应该运行collectstatic。

答案 2 :(得分:1)

我正在使用带有dokku的heroku python buildpack,并且没有运行collectstatic,因为它没有执行权限。他们在recent commit(2013年12月13日)修正了这个问题,所以现在应该可以了。