2013-10-16 27 views
5

我跟着官方Heroku docs on Django and Static Assets;我已經安裝dj-static,並把它添加到我的requirements.txt文件,正確地在我settings.py文件中配置所有的變量:當我將Django應用程序部署到Heroku時,爲什麼不會自動運行collectstatic?

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。

我試過debugging使用heroku run,但它只是複製靜態文件的預期。

我注意到,當我包括我的Procfilecollectstatic命令,即

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

+0

檢查此http://stackoverflow.com/a/15858757/263989 – fasouto

+0

@fasouto嘗試了它;沒有得到任何錯誤。我得到了一大堆「假裝複製......」和一個「284靜態文件複製」信息。 – 3cheesewheel

回答

4

看起來你可能會使用Heroku/production的特定設置模塊。此外,您已將環境變量DJANGO_SETTINGS_MODULE設置爲指向此設置模塊(並且以這種方式,當應用程序運行時,Django知道使用該模塊,而不是默認/開發模塊)。最後,您可能在Heroku/production settings模塊中配置了靜態資產設置(可能是STATIC_ROOT)。

好的,所以如果這一切都是正確的,那麼這裏就是問題:heroku環境變量只在服務時設置,而不是在編譯時。這很重要,因爲對於Heroku,collectstatic是編譯時操作。 (Heroku通過2個階段進行:1)編譯,其中包括設置應用程序(collectstatic,syncdb等)2)服務,應用程序的正常運行)。

所以,本質上,你做的一切都是正確的,但是Heroku並沒有將你的環境變量暴露給collectstatic,包括你指定的其他設置模塊。

要讓你的環境變量設置爲編譯時間,使Heroku的user-env-compile實驗室的功能是這樣的:

heroku labs:enable user-env-compile 

我覺得這是在默認情況下做了愚蠢的事情,並會有興趣聽爲什麼的Heroku認爲這是一個好主意。

+0

僅供參考這不再是一個有效的解決方案:(http://stackoverflow.com/questions/22904959/failing-to-enable-user-env-compile-on-heroku – andy

1

您是否嘗試過將user_env_compile設置添加到您的heroku配置中?

heroku labs:enable user-env-compile

隨着該啓用時,你會自動部署到Heroku的collectstatic應該運行。

1

我正在用dokku使用heroku python buildpack,並且collectstatic沒有運行,因爲它沒有執行權限。他們在recent commit(2013年12月13日)中修正了這個問題,所以現在應該可以開展工作。

相關問題