5

我已经关注了关于 Django 和 Static Assets 的 Heroku 官方文档;我已经安装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,但这只是按预期复制静态文件。

我注意到当我在我的中包含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/目录都丢失了,但静态文件仍在提供服务!

当我将 Django 应用程序部署到 Heroku 时,我仍然想知道为什么没有collectstatic自动运行——就像文档中提到的那样。

4

3 回答 3

4

看起来您可能正在为 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 为何认为这是一个好主意。

于 2014-01-28T04:17:53.490 回答
1

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

于 2014-01-10T10:48:29.387 回答
1

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

heroku labs:enable user-env-compile

启用后,无论何时自动部署到 heroku,都应该运行 collectstatic。

于 2014-01-09T19:23:28.677 回答