【问题标题】:Heroku Static files not working for django admin + File Not found + 404Heroku 静态文件不适用于 django 管理员 + 找不到文件 + 404
【发布时间】:2017-02-18 21:40:53
【问题描述】:

我的网站部署在 Heroku 上。除了静态文件,一切都很好。 这个路径上有静态文件doctor_app/doctor_app/static/

在本地,django 的管理面板运行良好。但是在heroku上,它没有找到任何静态文件。

令人惊讶的是,当我使用终端运行此命令时。

heroku run cat doctor_app/static/admin/css/base.css

它输出base.css的内容。这意味着静态文件在那里

我想知道为什么 django 没有找到任何文件?

欲了解更多信息,这是我的settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
#STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'staticfiles'),
)

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

STATIC_URL = '/static/'

【问题讨论】:

  • 你执行了“python manage.py collectstatic”吗?
  • 是的,我做到了。 @VijeshVenugopal
  • @AdilMalik “它没有找到任何静态文件”你的意思是它们返回 404 错误吗?如果是这样,您如何链接到模板中的那些静态文件?另外,请为静态文件发布您的settings.py 变量,例如STATICFILES_DIRS 等。
  • 是的,我收到 404 错误。我已经编辑了这个问题。请看看@YPCrumble
  • @AdilMalik 您仍然需要显示您如何链接到模板中的这些静态文件,即,哪一段 html 正在生成 404 错误,它指向的 URL 路径是什么,以及在模板中是如何实现的?

标签: django heroku django-admin


【解决方案1】:

这不是 Django 错误。 Django 所做的是准备好静态文件并将它们收集到STATIC_ROOT,这一切都在您的情况下设置。

请注意,为 Django 项目提供静态文件通常不在其职责范围内。您可以参考Django's doc on deploying static files 并尝试使用uwsginginx 等应用程序部署它们。

为了快速尝试,您可以将静态文件附加到 Django 的路由中,如 here 所述:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

就您提供的问题而言,这可能对您有用。

【讨论】:

  • 这对我帮助很大!谢谢
  • 注意:如果DEBUG=False,追加static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 将不起作用。在文档的注释部分明确提到:This helper function works only in debug mode
【解决方案2】:

Django 不支持在生产环境中提供静态文件。但是,出色的 WhiteNoise 项目可以集成到您的 Django 应用程序中,并且正是为此目的而设计的。

有关详细信息,请参阅 WhiteNoise 文档。

安装白噪声

首先,用 pip 安装 WhiteNoise:

pip install whitenoise

请务必将白噪声也添加到您的 requirements.txt 文件中。

接下来,将 WhiteNoise 安装到您的 Django 应用程序中。这是在 settings.py 的中间件部分(在顶部)完成的:

settings.py

MIDDLEWARE_CLASSES = (
    # Simplified static file serving.
    # https://warehouse.python.org/project/whitenoise/
    'whitenoise.middleware.WhiteNoiseMiddleware',
...

最后,如果您想启用 gzip 功能,还要将以下设置添加到 settings.py。

settings.py

简化的静态文件服务。

https://warehouse.python.org/project/whitenoise/

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

您的应用程序现在将直接从 Gunicorn 在生产环境中提供静态资源。这对于大多数应用程序来说已经足够了,但顶级应用程序可能想要探索使用带有 Django-Storages 的 CDN。

在构建期间收集静态 当 Django 应用程序部署到 Heroku 时,$ python manage.py collectstatic --noinput 会在构建期间自动运行。如果 collectstatic 步骤不成功,构建将失败。

调试 如果在构建期间 collectstatic 失败,则会提供有助于诊断问题的回溯。如果您需要有关运行 collectstatic 的环境的更多信息,请使用 DEBUG_COLLECTSTATIC 配置。

heroku config:set DEBUG_COLLECTSTATIC=1

这将在您的构建输出中显示执行 collectstatic 命令时 Python 可用的所有环境变量。

禁用 Collectstatic 有时,您可能不希望 Heroku 代表您运行 collectstatic。您可以使用 DISABLE_COLLECTSTATIC 配置禁用 collectstatic 构建步骤:

heroku config:set DISABLE_COLLECTSTATIC=1

这将完全禁用构建的 collectstatic 步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2017-07-12
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多