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

Sam*_*lan 10 css django dynamic

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

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

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

我看到两个选择:

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

  2. 使用自定义URL(例如"/ static/dynamic/css/<website_id> /styles.css"),该URL将路由到一个视图,该视图将获取所有必需的值并创建css文件.

我满足于任何一个选项,但想知道是否有其他人处理过类似的问题,并且可以对"最佳实践"提供一些见解.

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

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

Jor*_*dan 3

我已经成功地使用了选项#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