【问题标题】:Using a Django variable in a CSS file在 CSS 文件中使用 Django 变量
【发布时间】:2011-08-28 11:35:47
【问题描述】:

我正在尝试使用 Django 模板引擎或任何其他方式创建 动态 CSS 文件。

目前,我的 CSS 规则如下所示:

background-image: url('http://static.example.com/example.png');

其中http://static.example.com 对应于Python 中的STATIC_URL 变量。使用 Django 模板引擎,理论上我可以这样写:

background-image: url('{{ STATIC_URL }}example.png');

我的问题是,如何使用 Django 模板引擎(或任何其他方式)动态生成 CSS?

【问题讨论】:

    标签: python css django templates django-templates


    【解决方案1】:

    你基本上有两种选择:

    1. 动态地提供您的 CSS,在 urls.py 等中添加一个条目,就像它是一个 HTML 页面一样。您的模板文件将只是 CSS 而不是 HTML,但将使用普通的 Django 模板语法等。

    2. 快捷方式:使用相对路径引用背景图像。这对于您的环境可能可行,也可能不可行,但它是让静态 CSS 文件根据托管位置引用不同路径的便捷方式。

    【讨论】:

    • 谢谢。我认为相对路径方法不足以满足我的需求,但可能适用于另一种设置。第一种方法可行,但我有点担心速度。
    • 你可能会喜欢@cache_page 装饰器:docs.djangoproject.com/en/1.3/topics/cache/#the-per-view-cache
    • @Wylie - 您可以测试速度,但可能不会有问题。我有一个user.css 文件,我的页面引用它根本不是一个文件——它是在每次请求时动态生成的。我想过做一个生成和缓存,但没有性能理由这样做。
    • 我知道这已经有一段时间了,但您能否详细说明“动态提供您的 CSS,在 urls.py 中添加一个条目等,就像它是一个 HTML 页面一样。”?
    【解决方案2】:

    这里一个很好的解决方案是使用django-compressor。首先,如果您提供多个 CSS 文件,压缩器将通过减少请求数量来帮助改善页面加载时间。

    压缩/连接文件的一个副作用是压缩器会重写 css 文件中的 url,因此相对引用的静态文件(例如 ../img/logo.png)自动成为完全限定的 url,与静态文件 url(例如http://static.example.com/img/logo.png)。

    或者,您可以编写自定义过滤器来实现您想要的,或者,您可以将完全静态的 CSS 和一些动态部分压缩到一个文件中(例如,在您的基本布局文件中执行此操作):

    {% compress css %}
       <link .... />
       <style>
           .some_rule {background-image:{{MEDIA_URL}}/img/logo.png}
       </style>
    {% endcompress %}
    

    这也意味着您不必担心效率,因为 css/js 文件是在首次访问使用它们的模板时生成的,并且它们作为纯文件存储在您的静态目录中(这是可配置的) ,因此它们被用作普通的静态文件。

    【讨论】:

    • 感谢您的精彩解释。这是我在搜索时遇到的解决方案之一,但我没有看到一个简单的方法来使用它。
    • 它是一个用来提高性能的好工具,我通常只用它来连接,并在部署时对源 css 和 js 文件运行 yuicompressor,并为各种浏览器连接不同的 CSS 文件怪癖(需要有浏览器检测中间件,以及RequestContext中可用的变量来实现)
    • 我不明白 ../ 在开发环境中是如何工作的,但确实如此。有人知道吗?
    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 2015-10-02
    • 2022-01-11
    • 2015-09-21
    • 2010-09-27
    • 2016-08-09
    • 2016-12-25
    • 2019-01-17
    相关资源
    最近更新 更多