Django-Compress with debug=false 在设置中给出错误

Posted

技术标签:

【中文标题】Django-Compress with debug=false 在设置中给出错误【英文标题】:Django-Compress with debug=false in settings giving error 【发布时间】: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 页面会导致内部服务器错误。

【问题讨论】:

您如何提供文件?您的部署设置是否正确?您是否收集了静态文件并将您的服务器指向根目录? 【参考方案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 错误。

【讨论】:

就像西蒙说的那样。这是一个完整的例子:***.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/

【讨论】:

以上是关于Django-Compress with debug=false 在设置中给出错误的主要内容,如果未能解决你的问题,请参考以下文章

[ExtJS5学习笔记]第二十七节 CMD打包错误 Error C2009: YUI Parse Error (identifier is a reserved word => debu

js 工具类

coredump功能介绍

libevent::日志

express

IFEO 映像文件劫持