在Django中,如何在开发环境和生产环境下提供不同的静态文件?

4

我有一个生产和本地的DJANGO开发环境。为了将东西推向生产,我们有一个部署工具,可以缩小并压缩所有CSS和JS文件。

要在生产环境中使用它们,我需要像这样调用它们:

  <link rel="stylesheet" href="{{ STATIC_URL }}css/filename.min.css.gz">

但是在开发过程中,我希望使用普通的CSS文件(这样我就不必每次保存时重新压缩和gzip),如下所示:

  <link rel="stylesheet" href="{{ STATIC_URL }}css/filename.css">

有没有一种方法通过添加某些内容到部署程序来实现并自动化这个行为?或者有没有其他的解决方法(如果能够以一种干净的方式添加.gzip,则可以去掉.min扩展名吗?)
我想指出,我知道我可以实现一些 HTML 解析器,在每次部署时添加它,但我正在寻找一个整洁和 Django 相关的解决方案。

这可以通过使用模板标签输出整个href,并根据设置值执行不同操作来轻松管理。 - Daniel Roseman
3个回答

3

我喜欢@Nursultan的想法。为了实现这个想法,你可以编写一个上下文处理器,像这样:

# On yourapp.context_processor.py
from django.conf import settings

def debug_set(request):
    return {'debug_set': settings.DEBUG}

# On your settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
    .
    .
    .
    'yourapp.context_processors.debug_set',
)

# On your templates
{% if debug_set %}
    <link rel="stylesheet" href="{{ STATIC_URL }}css/filename.css">
{% else %}
    <link rel="stylesheet" href="{{ STATIC_URL }}css/filename.min.css.gz">
{% endif %}

1

我已经在使用Django压缩器,但我遇到了这个问题http://stackoverflow.com/questions/31389584/gulp-css-minify-gzip-django-compressor-not-working,它们可能有关吗?无论如何,我已经检查了文档,但我无法找出解决方案,@FlipperPA,你能更精确一些吗? - Pol Alvarez Vecino
如果有人需要更多细节,请注意:压缩器会在生产中自动加载 .gz 文件,因此无需更改名称,只需提供具有相同名称的已压缩文件。 - Pol Alvarez Vecino
抱歉回复晚了,这周我有点忙(实际上是在帮助组织一个Django会议)。是的,你可以让压缩器处理GZIP压缩,或者使用gulp进行压缩,并在django-compressor中禁用它。 - FlipperPA

0

我从未遇到过这个问题,但我想出了以下两个解决方案:

  1. 在生产和开发中使用不同的settings.py。但需要对*.min.js具有相同的名称并更改缩小器的配置。
  2. 或者使用全局变量并在任何地方编写

    {% if development_stage %} <link> {% else %} <link> {% endif %}

Django - 如何使变量在所有模板中可用?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接