2011-08-24 101 views
3

我经常遇到这样的情景,我认为在CSS和JavaScript文件中使用模板标记是有意义的,例如在{{STATIC_URL}}中使用{{STATIC_URL}} CSS来访问图像。我明白实现这一目标的唯一方法是让Django提供CSS和JavaScript文件。我对这种方法感兴趣。但在我提交之前,我想听听专家的经验。这种方法有哪些优缺点?谢谢。使用Django模板系统服务CSS和JavaScript有哪些优缺点

+2

那么你将有观点的逻辑和模板编译等的开销,但我猜想,应该不会有太大的小数量的文件,并使用Django的缓存系统的问题。但我宁愿使用某种JavaScript编译器([关闭](http://code.google.com/closure/)为例),也许[SASS]的(http://sass-lang.com/)或CSS的一些东西,并用一些轻量级的Web服务器来提供它们您也可以使用CSS图像的相对路径,因此您并不需要{{STATIC_URL}}。 –

+1

我对这个问题的答案也很感兴趣。我以前用过的动态生成的JS/CSS Django的,感觉很脏,哈克,但与此同时,它使开发和部署更容易。对CSS的图像相对路径和django.contrib.staticfiles应用 – sesh

+2

之间,你不应该需要使用Django的模板引擎只是为了解决路径问题。如果你有每个请求的动态CSS生成,你正在设置自己的缓存地狱。 – GDorn

回答

2

优点:

  • 你可以做一个事情的外观和行为很多每个请求的决定。
  • 您可以将不同的CSS/JS文件的数量降到最低。

缺点:

  • 浏览器往往缓存CSS和JS积极,所以你需要使用一些激进的反缓存技术。当然,这意味着禁用某些/所有静态文件的缓存。
  • 每个CSS和JS请求都会消耗WSGI服务器的另一个线程。在正常的请求/响应周期中,每个请求通常占用一个线程;至少,现在你的应用程序可以同时处理200个并发请求,现在只能处理66个。
  • 当你的网站变得很大时,CDN可能无法帮到你。

替代方案:

  • 通过javascript扭捏的CSS,并设置你的页面模板中JavaScript变量来控制调整。
  • 使用多个CSS文件并动态控制它们的包含。
  • 根据需要生成静态文件,然后将其缓存到磁盘并通过mod_xsendfile提供。这只适用于从django进程可以写入的地方提供静态文件,例如在同一台机器上或网络安装上。
+0

感谢您的明确和有用的分析。 – tamakisquare

0

就个人而言,我一直坚持使用Django团队的建议来制作CSS和JavaScript静态文件,由服务器而不是通过Django直接提供。这不是一个问题,简化了很多东西。一般来说,任何时候我想我需要一个dynamioc CSS或JS文件,有一种重构的方式,所以我不这样做。

例如:

在CSS中使用{{STATIC_URL}}的访问图像

我不知道你怎么{{ STATIC_URL }}是可变的,但我发现,使用我的页面中的<base>标记修复了很多事情。我认为这是用于背景图像?你能否更新你的问题来举个例子?

我做的另一件事是,如果我的JavaScript需要动态数据,我会将大部分代码放在一个JavaScript库中作为静态文件,然后将最小动态内容放入<script>标记处页面结尾。通常我会把它全部放在一个对象中(看起来很像JSON),然后将该对象传递给一个函数。想想看,你可以把所有的动态东西,在你的视图函数中做一个字典,编码成JSON,并通过上下文传递它。那么你的页面模板只是看起来是这样的:

<html><head> 
... 
<script src="{{ STATIC_URL }}/js/foo.js"></script> 
... 
</head><body> 
... 
<script> 
    foo_main({{ foo_params_json|safe }}); 
</script> 
</body></html> 

这使得它成为很多更易于重复使用此代码。

相关问题