如何根据Django站点中的帐户设置“动态”创建自定义CSS?

时间:2010-06-17 03:18:54

标签: css django dynamic

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

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

我的问题是如何使用帐户的自定义配色方案动态提供CSS。

我看到两个选项:

  1. 将CSS块添加到基本模板,该模块将覆盖通过上下文处理器传入的变量样式。

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

  3. 我对这两种选择感到满意,但是想知道是否有其他人处理过类似的问题,并且可以就“最佳实践”提供一些见解。

    更新:我倾向于选项2,因为我认为这样可以让您获得更好的缓存。所以它第一次是动态的,存储在memcache(或其他)中,当用户在管理站点更新其设置时无效。

    更新:首先,我要感谢大家的建议。到目前为止,所有答案都集中在生成静态文件。虽然这在生产中很有用,但在开发过程中感觉像是一个巨大的负担。如果我想添加一个要设置样式的新元素,或者调整现有样式,我必须完成并重新创建每个css文件。当然,这可以通过管理命令来完成,但我觉得这不值得。动态地执行它会为每个页面加载添加1个或2个查询,这是我在此阶段不担心的事情。我需要知道的是,在某些时候我将能够在不重写整个事物的情况下对其进行缓存。

4 个答案:

答案 0 :(得分:2)

我已成功使用选项#2。有两种不错的方法可以更新我知道的生成的静态文件:

  1. 使用版本查询字符串,例如/special_path.css?v=11452354234,其中v参数是从数据库字段,memcached中的键或其他一些持久文件生成的。版本由管理员更新,或者对于开发,如果参数是特殊的,如v = -1,则只需要生成一代。一段时间后,你需要一个过程来清理老一代。

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

答案 1 :(得分:1)

好问题。

我建议在保存颜色方案后预先生成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文件的逻辑(通过渲染一些模板)。

如果您的文件格式更改,您可以在模型定义中进行更改(使用新字段的某些默认值),在模板中进行少量更改并为每个exisintg类实例运行save方法。这会更新你的css文件。

这应该很好用。

答案 2 :(得分:1)

可以生成css并将其存储在与用户配置文件/设置相同的模型中的文本字段中。然后可以在更改样式时重新创建它们。然后在上面做你的选择1。

答案 3 :(得分:1)

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