簡體   English   中英

當我將Django應用程序部署到Heroku時,為什么不自動運行collectstatic?

[英]Why isn't collectstatic being run automatically when I deploy my Django app to Heroku?

我已經關注了關於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 調試 ,但這只是按預期復制靜態文件。

我注意到當我在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時。

看起來您可能正在使用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認為這是個好主意。

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

heroku labs:enable user-env-compile

啟用后,只要您自動部署到heroku,就應該運行collectstatic。

我正在使用帶有dokku的heroku python buildpack ,並且沒有運行collectstatic,因為它沒有執行權限。 他們在最近的一次提交 (2013年12月13日)中確定了這一點,所以現在應該可以使用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM