Почему collectstatic не запускается автоматически, когда я развертываю свое приложение Django на Heroku?

Я следил за официальной документацией Heroku по Django и статическим активам; Я установил 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/ отсутствует, и тем не менее статические файлы все еще обслуживаются!

Я все же хотел бы знать, почему collectstatic не запускается автоматически, как упоминалось в документах, когда я развертываю свое приложение Django на Heroku.


person 3cheesewheel    schedule 16.10.2013    source источник
comment
Проверьте это stackoverflow.com/a/15858757/263989.   -  person fasouto    schedule 17.10.2013
comment
@fasouto Пробовал; не получил никаких ошибок. Я получил кучу сообщений Pretend to copy '...' и 284 static files copied. в конце.   -  person 3cheesewheel    schedule 17.10.2013


Ответы (3)


Похоже, вы используете специальный модуль настроек для 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 счел это хорошей идеей.

person t-mart    schedule 28.01.2014
comment
К вашему сведению, это больше не допустимое решение :( stackoverflow.com/questions/22904959/ - person andy; 12.02.2015

Вы пытались добавить параметр user_env_compile в конфигурацию вашего героя?

heroku labs:enable user-env-compile

С этим включенным collectstatic должен запускаться всякий раз, когда вы автоматически разворачиваетесь на героку.

person mgrouchy    schedule 09.01.2014

Я использую сборочный пакет heroku python с dokku, и collectstatic не запускался, потому что он нет разрешения на выполнение. Они исправили это в недавней фиксации (13 декабря 2013 г.), поэтому это должно работать сейчас.

person tyrion    schedule 10.01.2014