代码之家  ›  专栏  ›  技术社区  ›  Sam Dolan

如何在Django网站中根据帐户设置“即时”创建自定义CSS?

  •  10
  • Sam Dolan  · 技术社区  · 16 年前

    所以我正在写一个基于django的网站,它允许用户通过管理界面选择颜色方案。

    我已经有了将当前请求(基于域)链接到帐户的中间件/上下文处理器。

    我的问题是如何使用客户的自定义配色方案动态地为CSS服务。

    我看到两种选择:

    1. 向基模板添加一个CSS块,该基模板重写通过上下文处理器传入的样式w/变量。

    2. 使用自定义URL(例如“/static/dynamic/css/<website_id>/styles.css”),将其路由到获取所有必要值并创建css文件的视图。

    我对这两种选择都很满意,但我想知道是否还有其他人处理过类似的问题,并且能够对“最佳实践”给出一些见解。

    更新 :我倾向于选择2号,因为我认为这将允许更好的缓存。因此,它第一次是动态的,存储在memcache(或其他)中,当用户在管理站点更新其设置时,它就会失效。

    更新 首先,我要感谢迄今为止所有人的建议。到目前为止,所有的答案都集中在生成静态文件上。虽然这在生产中很有用,但在开发过程中却感觉到了巨大的负担。如果我想添加一个新的元素来设置样式,或者调整现有的样式,我就必须重新创建每个CSS文件。当然,这可以通过一个管理命令来完成,但我只是觉得它不值得。动态操作会在每个页面加载中添加1到2个查询,这在这个阶段我并不担心。我需要知道的是,在某个时刻,我可以缓存它而不重写整个东西。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Jordan    16 年前

    我成功地使用了选项2。有两种更新生成的静态文件的好方法,我知道:

    1. 使用类似/special_path.css的版本querystring?v=11452354234,其中v参数是从数据库字段、memcached中的键或其他持久文件生成的。版本由管理员更新,或者为了开发,如果参数是特殊的,比如v=-1,您只会使生成不被保存。你需要一个过程来清理一段时间后的老一代。

    2. 不要使用版本查询字符串,而是让它先查找生成的文件,如果找不到它,它就会生成它。您可以创建一个cron作业或wsgi应用程序,用于查找文件系统更改以进行开发,并从管理面板中获得一个钩子,用于在更新后删除代。下面是一个监控的例子,您必须将其转换为特定于您的后代,而不是Django。 http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring%5FFor%5FCode%5FChanges

        2
  •  1
  •   PhoebeB    16 年前

    可以生成CSS并将其存储在与用户配置文件/设置相同的模型中的文本字段中。如果您更改样式,那么可以有一个视图来重新创建它们。然后执行上面的选项1。

        3
  •  1
  •   dzida    16 年前

    好问题。

    我建议在保存颜色方案后预生成CSS文件。这将对缓存和整个页面加载时间产生积极影响。您可以将CSS文件存储在目录中 /media/css/custom/<id or stometing>/styles.css 或 /media/css/custom/<id or sth>.css 在模板中添加 <link rel="stylesheet" href="/media/css/custom/{{some_var_pointing _to_file_name}}" />

    你也可以用一些 CSS文件名中的随机数或日期 每次保存文件时都可以更改。多亏了这个浏览器,一旦发生更改,就会立即加载文件。

    更新:使用模型改进此示例的示例 为了便于管理这些文件,您可以创建简单的模型(每个用户一个):

    class UserCSS(models.Model):
        bg_color = models.CharField(..)
        ...
        ...
    

    字段(如bg_color)可以表示CSS文件的一部分。你可以去产卵 save 方法添加为用户创建CSS文件的逻辑(通过呈现某个模板)。

    如果文件格式发生更改,您可以在模型定义中进行更改(对新字段使用一些默认值),在模板中进行少量更改,并为类的每个现有实例运行save方法。这将更新您的CSS文件。

    这应该很有效。

        4
  •  1
  •   Pierre-Jean Coudert    16 年前

    我将创建一个包含主题元素的MD5密钥,将该密钥存储在用户配置文件中,并创建一个以该MD5密钥命名的ccs文件:您将获得静态文件访问和自动主题更改检测。