夹层 - 无法在 Heroku 中加载 css 和 js

Posted

技术标签:

【中文标题】夹层 - 无法在 Heroku 中加载 css 和 js【英文标题】:Mezzanine - Can't load css and js in Heroku 【发布时间】:2016-02-02 18:56:47 【问题描述】:

我在托管我在 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。我做错了什么?

【问题讨论】:

你的 urls.py 中有什么? @1844144 问题已更新为 urls.py 【参考方案1】:

您不需要在每次启动 web dyno 时都运行 collectstaticheroku run python manage.py collectstatic --noinput 的输出是什么?

翻看the heroku docs,不清楚你是否执行了这一步:

Django 不会自动创建 collectstatic 使用的目标目录,因此我们建议向您的存储库添加一个虚拟文件,如此处所示。

【讨论】:

【参考方案2】:

您的静态文件配置已损坏。 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 命令输出的其他信息,如另一个答案中所述。

最后但并非最不重要的一点是,您的调试应用程序永远不能从 Internet 访问。有恶意的人可以从调试消息中了解很多有关您的设置的信息。

问候, 马塞尔·迈斯纳

【讨论】:

你能添加你的项目目录布局的描述吗?同样是 collectstatic 命令的输出,您提供的日志仅包含 gunicorn 生成的消息。 manage.py 的输出是旧配置还是新配置? 哪个目录包含你的静态资源?是 /app/static 还是 /app/moderna/static 或两者兼而有之?您需要在 STATICFILES_DIRS 中调整这些路径。带有 dummy.txt 的目录也应该称为 staticfiles。我还根据您提供的数据更新了我的答案。你可以忽略我之前的评论。

以上是关于夹层 - 无法在 Heroku 中加载 css 和 js的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular + Webpack + Heroku 应用程序中加载应用程序之前包含 CSS

无法在heroku中加载favicon.ico for rest api

Heroku 无法加载我的 css 文件,因为它是 mimetype

无法在 MVC 项目中加载 CSS

无法在 codeigniter 中加载 Css

Heroku 不会在 Visual Studio Code 中加载