Мецанин - Не може да зареди css и js в Heroku

Имам някои проблеми с хостването на прост уебсайт, който създадох в Heroku. Уебсайтът е създаден с помощта на Mezzanine и използва whitenoise и gunicorn. Проблемът е: получавам грешка 404 в някои статични ресурси, като css и js. Можете да видите проблемите на http://blrg-advogados.herokuapp.com.

Това е съдържанието на Procfile:

web: python manage.py collectstatic --noinput; gunicorn --workers=4 site_advogados.wsgi 0.0.0.0:$PORT

wsgi.py

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site_advogados.settings")

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

и ето част от settings.py:

ALLOWED_HOSTS = ['*']
DEBUG = False
PROJECT_APP_PATH = os.path.dirname(os.path.abspath(__file__))
PROJECT_APP = os.path.basename(PROJECT_APP_PATH)
PROJECT_ROOT = BASE_DIR = os.path.dirname(PROJECT_APP_PATH)
CACHE_MIDDLEWARE_KEY_PREFIX = PROJECT_APP
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

MEDIA_URL = STATIC_URL + "media/"
MEDIA_ROOT = os.path.join(PROJECT_ROOT, *MEDIA_URL.strip("/").split("/"))
ROOT_URLCONF = "%s.urls" % PROJECT_APP
TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, "templates"),)

urls.py е така:

from __future__ import unicode_literals
from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from mezzanine.core.views import direct_to_template
from mezzanine.conf import settings
from views import contato

admin.autodiscover()

urlpatterns = i18n_patterns("",
                        ("^admin/", include(admin.site.urls)),
                        )

if settings.USE_MODELTRANSLATION:
    urlpatterns += patterns('',
                        url('^i18n/$', 'django.views.i18n.set_language', name='set_language'),
                        )

urlpatterns += patterns('',
                    url("^$", direct_to_template, {"template": "index.html"}, name="home"),
                    url(r'^contato/$', contato, name='contato'),
                    ("^", include("mezzanine.urls")),
                    )

handler404 = "mezzanine.core.views.page_not_found"
handler500 = "mezzanine.core.views.server_error"

Дневник:

2015-12-27T12:44:56.109833+00:00 app[web.1]: Traceback (most recent call last):
2015-12-27T12:44:56.109850+00:00 app[web.1]:     self.handle_request(listener, req, client, addr)
2015-12-27T12:44:56.109851+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 171, in handle_request
2015-12-27T12:44:56.109852+00:00 app[web.1]:     respiter = self.wsgi(environ, resp.start_response)
2015-12-27T12:44:56.109853+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/whitenoise/base.py", line 119, in __call__
2015-12-27T12:44:56.109854+00:00 app[web.1]:     return self.application(environ, start_response)
2015-12-27T12:44:56.109855+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 189, in __call__
2015-12-27T12:44:56.109855+00:00 app[web.1]:     response = self.get_response(request)
2015-12-27T12:44:56.109857+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 175, in get_response
2015-12-27T12:44:56.109858+00:00 app[web.1]:     response = self.get_exception_response(request, resolver, 404)
2015-12-27T12:44:56.109858+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 90, in get_exception_response
2015-12-27T12:44:56.109861+00:00 app[web.1]:     return callback(request, **param_dict)
2015-12-27T12:44:56.109863+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/mezzanine/core/views.py", line 222, in server_error
2015-12-27T12:44:56.109861+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 110, in _wrapped_view
2015-12-27T12:44:56.109859+00:00 app[web.1]:     response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
2015-12-27T12:44:56.109862+00:00 app[web.1]:     response = view_func(request, *args, **kwargs)
2015-12-27T12:44:56.109860+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 268, in handle_uncaught_exception
2015-12-27T12:44:56.109864+00:00 app[web.1]:     return HttpResponseServerError(t.render(context))
2015-12-27T12:44:56.109864+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/backends/django.py", line 74, in render
2015-12-27T12:44:56.109865+00:00 app[web.1]:     return self.template.render(context)
2015-12-27T12:44:56.109866+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 209, in render
2015-12-27T12:44:56.109866+00:00 app[web.1]:     return self._render(context)
2015-12-27T12:44:56.109867+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 201, in _render
2015-12-27T12:44:56.109868+00:00 app[web.1]:     return self.nodelist.render(context)
2015-12-27T12:44:56.109869+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 903, in render
2015-12-27T12:44:56.109870+00:00 app[web.1]:     bit = self.render_node(node, context)
2015-12-27T12:44:56.109870+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 917, in render_node
2015-12-27T12:44:56.109871+00:00 app[web.1]:     return node.render(context)
2015-12-27T12:44:56.109872+00:00 app[web.1]:     return compiled_parent._render(context)
2015-12-27T12:44:56.109872+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/loader_tags.py", line 135, in render
2015-12-27T12:44:56.109874+00:00 app[web.1]:     return self.nodelist.render(context)
2015-12-27T12:44:56.109873+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 201, in _render
2015-12-27T12:44:56.109875+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 903, in render
2015-12-27T12:44:56.109875+00:00 app[web.1]:     bit = self.render_node(node, context)
2015-12-27T12:44:56.109878+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/templatetags/static.py", line 105, in render
2015-12-27T12:44:56.109876+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 917, in render_node
2015-12-27T12:44:56.109877+00:00 app[web.1]:     return node.render(context)
2015-12-27T12:44:56.109878+00:00 app[web.1]:     url = self.url(context)
2015-12-27T12:44:56.109879+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py", line 16, in url
2015-12-27T12:44:56.109880+00:00 app[web.1]:     return static(path)
2015-12-27T12:44:56.109882+00:00 app[web.1]:     return staticfiles_storage.url(path)
2015-12-27T12:44:56.109881+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py", line 9, in static
2015-12-27T12:44:56.109884+00:00 app[web.1]:     hashed_name = self.stored_name(clean_name)
2015-12-27T12:44:56.109883+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 131, in url
2015-12-27T12:44:56.109884+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 280, in stored_name
2015-12-27T12:44:56.109885+00:00 app[web.1]:     cache_name = self.clean_name(self.hashed_name(name))
2015-12-27T12:44:56.109886+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 94, in hashed_name
2015-12-27T12:44:56.109886+00:00 app[web.1]:     (clean_name, self))
2015-12-27T12:44:56.109887+00:00 app[web.1]: ValueError: The file 'img/favicon.ico' could not be found with <whitenoise.django.GzipManifestStaticFilesStorage object at 0x7f6dc4a1e2d0>.
2015-12-27T12:44:56.329261+00:00 app[web.1]: [2015-12-27 12:44:56 +0000] [15] [ERROR] Error handling request
2015-12-27T12:44:56.329266+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 130, in handle
2015-12-27T12:44:56.329265+00:00 app[web.1]: Traceback (most recent call last):
2015-12-27T12:44:56.329268+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 171, in handle_request
2015-12-27T12:44:56.329267+00:00 app[web.1]:     self.handle_request(listener, req, client, addr)
2015-12-27T12:44:56.329270+00:00 app[web.1]:     respiter = self.wsgi(environ, resp.start_response)
2015-12-27T12:44:56.329272+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/whitenoise/base.py", line 119, in __call__
2015-12-27T12:44:56.329287+00:00 app[web.1]:     return self.application(environ, start_response)
2015-12-27T12:44:56.329288+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 189, in __call__
2015-12-27T12:44:56.329288+00:00 app[web.1]:     response = self.get_response(request)
2015-12-27T12:44:56.329289+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 175, in get_response
2015-12-27T12:44:56.329290+00:00 app[web.1]:     response = self.get_exception_response(request, resolver, 404)
2015-12-27T12:44:56.329290+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 90, in get_exception_response
2015-12-27T12:44:56.329292+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 268, in handle_uncaught_exception
2015-12-27T12:44:56.329291+00:00 app[web.1]:     response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
2015-12-27T12:44:56.329292+00:00 app[web.1]:     return callback(request, **param_dict)
2015-12-27T12:44:56.329293+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 110, in _wrapped_view
2015-12-27T12:44:56.329293+00:00 app[web.1]:     response = view_func(request, *args, **kwargs)
2015-12-27T12:44:56.329294+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/mezzanine/core/views.py", line 222, in server_error
2015-12-27T12:44:56.329295+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/backends/django.py", line 74, in render
2015-12-27T12:44:56.329294+00:00 app[web.1]:     return HttpResponseServerError(t.render(context))
2015-12-27T12:44:56.329296+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 209, in render
2015-12-27T12:44:56.329295+00:00 app[web.1]:     return self.template.render(context)
2015-12-27T12:44:56.329297+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 201, in _render
2015-12-27T12:44:56.329296+00:00 app[web.1]:     return self._render(context)
2015-12-27T12:44:56.329297+00:00 app[web.1]:     return self.nodelist.render(context)
2015-12-27T12:44:56.329297+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 903, in render
2015-12-27T12:44:56.329298+00:00 app[web.1]:     bit = self.render_node(node, context)
2015-12-27T12:44:56.329298+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 917, in render_node
2015-12-27T12:44:56.329299+00:00 app[web.1]:     return node.render(context)
2015-12-27T12:44:56.329299+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/loader_tags.py", line 135, in render
2015-12-27T12:44:56.329300+00:00 app[web.1]:     return compiled_parent._render(context)
2015-12-27T12:44:56.329306+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 201, in _render
2015-12-27T12:44:56.329307+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 903, in render
2015-12-27T12:44:56.329307+00:00 app[web.1]:     return self.nodelist.render(context)
2015-12-27T12:44:56.329308+00:00 app[web.1]:     return node.render(context)
2015-12-27T12:44:56.329307+00:00 app[web.1]:     bit = self.render_node(node, context)
2015-12-27T12:44:56.329308+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/template/base.py", line 917, in render_node
2015-12-27T12:44:56.329310+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py", line 16, in url
2015-12-27T12:44:56.329309+00:00 app[web.1]:     url = self.url(context)
2015-12-27T12:44:56.329313+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 94, in hashed_name
2015-12-27T12:44:56.329308+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/templatetags/static.py", line 105, in render
2015-12-27T12:44:56.329314+00:00 app[web.1]: ValueError: The file 'img/favicon.ico' could not be found with <whitenoise.django.GzipManifestStaticFilesStorage object at 0x7f6dc4a1e2d0>.
2015-12-27T12:44:56.329310+00:00 app[web.1]:     return static(path)
2015-12-27T12:44:56.329313+00:00 app[web.1]:     cache_name = self.clean_name(self.hashed_name(name))
2015-12-27T12:44:56.329312+00:00 app[web.1]:     hashed_name = self.stored_name(clean_name)
2015-12-27T12:44:56.329312+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 280, in stored_name
2015-12-27T12:44:56.329314+00:00 app[web.1]:     (clean_name, self))
2015-12-27T12:44:56.329311+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 131, in url
2015-12-27T12:44:56.329311+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py", line 9, in static
2015-12-27T12:44:56.329311+00:00 app[web.1]:     return staticfiles_storage.url(path)
2015-12-27T12:44:56.330945+00:00 heroku[router]: at=info method=GET path="/favicon.ico/" host=blrg-advogados.herokuapp.com request_id=3c54ce79-8686-42a9-a335-f217abb8d6f2 fwd="177.36.203.24" dyno=web.1 connect=2ms service=31ms status=500 bytes=244

Папката на моя проект е така:

Оформление на проекта

и изходът от collect static е следният:

Running python manage.py collectstatic --noinput on blrg-advogados... up, run.4811
Traceback (most recent call last):
File "manage.py", line 14, in <module>
execute_from_command_line(sys.argv)
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 351, in execute_from_command_line
utility.execute()
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 343, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
self.execute(*args, **cmd_options)
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
output = self.handle(*args, **options)
File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 168, in handle
collected = self.collect()
File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 98, in collect
for path, storage in finder.list(self.ignore_patterns):
File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/finders.py", line 112, in list
for path in utils.get_files(storage, ignore_patterns):
File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/utils.py", line 28, in get_files
directories, files = storage.listdir(location)
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/files/storage.py", line 300, in listdir
for entry in os.listdir(path):
OSError: [Errno 2] No such file or directory: '/app/site_advogados/static'

както можете да си представите, когато задам DEBUG = True, работи правилно, но тъй като искам да тествам производствената среда, трябва да използвам DEBUG = False. Какво правя грешно?


person brevleq    schedule 02.11.2015    source източник
comment
Какво има във вашия urls.py?   -  person 1844144    schedule 05.12.2015
comment
@1844144 въпросът беше актуализиран с urls.py   -  person brevleq    schedule 05.12.2015


Отговори (2)


Не трябва да се налага да стартирате collectstatic всеки път, когато стартирате уеб дино. Какъв е резултатът от heroku run python manage.py collectstatic --noinput?

Преглеждайки документите на heroku, не е ясно дали сте извършили тази стъпка:

Django няма автоматично да създаде целевата директория, която събира статични употреби, затова препоръчваме да добавите фиктивен файл към вашето хранилище, както се вижда тук.

person Steven    schedule 08.12.2015

Вашата статична файлова конфигурация е повредена. STATIC_ROOT трябва да бъде абсолютен път като /some/absolute/path/. Настройката TEMPLATE_DIRS е остаряла, ако приемем, че сте на Django 1.8, можете да използвате вместо нея TEMPLATE dict. Опцията APP_DIRS кара django да търси директории с шаблони във всички директории на инсталирани приложения. Допълнителни директории могат да се добавят като списък с помощта на опцията DIR.

Ето как вероятно трябва да изглежда settings.py (имам нужда от оформлението на директорията на вашите проекти, за да съм сигурен):

ALLOWED_HOSTS = ['*']
DEBUG = False
PROJECT_APP_PATH = os.path.dirname(os.path.abspath(__file__))
PROJECT_APP = os.path.basename(PROJECT_APP_PATH)
BASE_DIR = os.path.dirname(PROJECT_APP_PATH)
CACHE_MIDDLEWARE_KEY_PREFIX = PROJECT_APP
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
# This is the path where Django will store the collected files
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
# STATICFILES_DIRS must contain the absolut path to your static resources
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
    # add more paths with static files here 
)

MEDIA_URL = STATIC_URL + "media/"
MEDIA_ROOT = os.path.join(BASE_DIR, *MEDIA_URL.strip("/").split("/"))
ROOT_URLCONF = "%s.urls" % PROJECT_APP

TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'APP_DIRS': True,
    # Additional directories to look for templates
    'DIRS': [some_template_directory,],
}]

С тази конфигурация събирането и обслужването на статични файлове трябва да работи. Ако не работи, моля, предоставете допълнителна информация за структурата на директорията на вашите проекти и изхода на командата heruko run manage.py collectstatic --noinput, както е поискано в другия отговор.

Не на последно място, вашето приложение за отстраняване на грешки никога не трябва да бъде достъпно от интернет. Хората със злонамерени намерения могат да научат много за вашата настройка от съобщенията за отстраняване на грешки.

Поздрави, Марсел Майснер

person Katrin Meißner    schedule 11.12.2015
comment
Можете ли да добавите описание на оформлението на директорията на вашите проекти? Също така резултатът от командата collectstatic, регистрационният файл, който предоставихте, съдържа само генерирани от gunicorn съобщения. - person Katrin Meißner; 29.12.2015
comment
Резултатът от manage.py със старата ви конфигурация ли е или с новата? - person Katrin Meißner; 02.01.2016
comment
Коя директория съдържа вашите статични ресурси? дали е /app/static или /app/moderna/static или и двете? Трябва да коригирате тези пътища в STATICFILES_DIRS. Също така директорията с dummy.txt трябва да се нарича staticfiles. Също така актуализирах отговора си според предоставените от вас данни. Можете да игнорирате предишния ми коментар. - person Katrin Meißner; 02.01.2016