9

I'm having some problems hosting a simple website I've created in Heroku. The website was created using Mezzanine and uses whitenoise and gunicorn. The problem is: I'm getting 404 error in some static resources, like css and js. You can see the problems at http://blrg-advogados.herokuapp.com.

This is the Procfile content:

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)

and here is some part of 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 is like this:

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"

Log:

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

My project folder is like this:

Project layout

and the output of collect static is this:

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'

as you can imagine, when I set DEBUG = True it works correctly, but as I want test the production environment I need use DEBUG = False. What I'm doing wrong?

brevleq
  • 1,866
  • 8
  • 46
  • 90

2 Answers2

3

You should not need to run collectstatic every time you start your web dyno. What is the output of heroku run python manage.py collectstatic --noinput?

Looking through the heroku docs, it is not clear if you have performed this step:

Django won’t automatically create the target directory that collectstatic uses, so we recommend adding a dummy file to your repository, as seen here.

Wasi Ahmad
  • 27,225
  • 29
  • 85
  • 140
Steven
  • 1,893
  • 11
  • 14
0

Your static file configuration is broken. STATIC_ROOT needs to be an absolute path like /some/absolute/path/. The TEMPLATE_DIRS setting is outdated, assuming you're on Django 1.8 you can use the TEMPLATE dict instead. The APP_DIRS option makes django look for template directories in all installed application dirs. Additional directories can be added as a list using the DIR option.

This is how the settings.py should probably look like (I'd need your projects dir layout to be sure):

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,],
}]

With this configuration collection and serving of static files should work. If it does not work, please provide additional information on your Projects directory structure and the output of the heruko run manage.py collectstatic --noinput command, as asked in the other answer.

Last but not least, your debug application should never ever be accessible from the internet. People with malicious intents can learn a lot about your setup from the debug messages.

Regards, Marcel Meißner

  • Can you add a description of your projects directory layout? Also the output of the collectstatic command, the log you provided contains only gunicorn generated messages. – Katrin Meißner Dec 29 '15 at 13:15
  • Is the output of manage.py with your old configuration or the new one? – Katrin Meißner Jan 01 '16 at 22:03
  • Which directory contains your static resources? is it /app/static or /app/moderna/static or both? You need to adjust those paths in STATICFILES_DIRS. Also the directory with the dummy.txt should be called staticfiles. I also updated my answer according to the data you provided. You can ignore my earlier comment. – Katrin Meißner Jan 01 '16 at 22:20