[英]How to instruct Heroku NOT to run collectstatic automatically on deploy?
[英]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)編譯,包括設置應用程序( collectstatic
, syncdb
等)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.