【问题标题】:Django-Compress with debug=false in settings giving errorDjango-Compress with debug=false 在设置中给出错误
【发布时间】:2012-07-15 06:38:48
【问题描述】:

我在 django 中遇到了一个奇怪的问题。我正在使用 django-compress 应用程序。直到调试为真,一切顺利。当我执行 debug=False 时,如果是 404,我将面临内部服务器错误问题,如果没有 404,我将面临没有 js 和 css 的页面。最糟糕的是,在控制台上我收到以下错误

UncompressableFileError: 'css/default.css' 无法通过 COMPRESS_URL ('/static/') 并且不能被压缩 [16/Jul/2012 17:17:05]“GET /static/img/favicon.ico HTTP/1.1”500 59

像这样,它为每个可通过 /static/ 访问的 GET 请求显示 500

所以现在不获取 js 和 css 的原因很清楚了。但是 404 页面出现错误的原因尚不清楚。

即使我尝试禁用和启用 django-compress,但在启用正常页面时也会显示 404 错误

请告诉我是什么导致所有 /static/ 事物出现 500 错误,以及为什么 404 页面会导致内部服务器错误。

【问题讨论】:

  • 您如何提供文件?您的部署设置是否正确?您是否收集了静态文件并将您的服务器指向根目录?

标签: python django django-templates django-compressor


【解决方案1】:

DEBUG = True Django 提供静态文件时。这意味着它可以在每个 Django 应用程序的/static/ 目录中找到静态文件。反过来,这意味着 django-compressor 可以找到它需要压缩的每个静态文件。

DEBUG = False Django 不再提供静态文件但它们应该由网络服务器提供服务时。它通过提供STATIC_ROOT 目录(通常是/static/)中的所有静态文件来实现这一点。这意味着 Django 应用程序中的所有静态文件都需要放在那里。

这可以通过collectstatic 命令完成(参见 Django 文档中的The staticfiles app)。运行该命令后,所有静态文件都应该位于 STATIC_ROOT 中,并且 django-compressor 应该能够再次找到这些文件。这解决了您在使用静态文件时遇到的 404 错误,并且当 django-compressor 工作时,您将不会再遇到 500 错误。

【讨论】:

  • 就像西蒙说的那样。这是一个完整的例子:stackoverflow.com/questions/10460028/…
  • 嘿@Simeon 我已经运行 collectstatic 命令然后我也面临同样的问题。我不明白出了什么问题。这里发生的事情是我认为 404 页面抛出了一些内部服务器错误并且我收到错误,我不明白为什么它找不到静态文件
  • @ParitoshSingh:您是否配置了 Web 服务器以提供静态文件?您需要这样做并运行 collectstatic (您已经完成了)。然后您可以查看静态文件。
  • @SimeonVisser 你是对的,但在这种情况下它应该给出 404 错误,为什么它会给出内部服务器错误
  • @ParitoshSingh:您的 Web 服务器配置可能有问题?如果 500 错误来自 Apache/nginx,那么您需要修复它。或者你看到 Django 500 错误页面了吗?
【解决方案2】:

对于 Django >= 1.5,如果您遇到此问题,请确保您正确设置了 ALLOWED_HOSTS 设置。没有该设置会使 Django Compressor 落入UncompressableFileError

我知道我们是在 2014 年,这个问题有点老了 ;) 但我今天遇到了这个问题,我的特殊情况的解决方案是这样的,而且没有任何解释。

希望它可以帮助其他人。

【讨论】:

    【解决方案3】:

    您可以打开 django 的电子邮件功能。只需像下面这样修改setting.py:

    DEBUG = False
    ADMINS = (
        ('username', 'username@example.com'),
    )
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_HOST_USER = ''
    EMAIL_HOST_PASSWORD = ''
    EMAIL_PORT = 587
    EMAIL_USE_TLS = True
    

    如果发生 500,您将收到一封来自 django 的电子邮件。我希望这可以帮助你。

    【讨论】:

      【解决方案4】:

      这个问题也困扰着我。大多数解决方案都是关于设置ALLOWED_HOST。这些答案都不起作用。由于没有仔细阅读文档,我遇到了这个问题。

      所以,我们必须先了解这一点。为每个请求编译所有资产是不现实的,对吧?因此,当您将应用程序部署到生产服务器以及关闭调试模式时。你应该记住不要让这种情况发生。

      根据文档,我通过下面的代码解决了这个问题

      COMPRESS_OFFLINE = True
      

      每次我部署我的应用程序时,我都会运行这个命令

      python manage.py compress
      

      对于弹性豆茎,你可以使用这个命令:

      container_commands:
        ...
        03_compress:
          command: "source /opt/python/run/venv/bin/activate && python manage.py compress"
      

      这可以让您进行离线预编译,而无需在每个请求上编译所有资产。

      参考:https://django-compressor.readthedocs.io/en/latest/scenarios/

      【讨论】:

        猜你喜欢
        • 2013-11-21
        • 2021-10-30
        • 2021-04-04
        • 2021-08-13
        • 2021-08-29
        • 2013-02-14
        • 1970-01-01
        • 2017-01-20
        • 2017-09-19
        相关资源
        最近更新 更多