2011-08-24 102 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> 

這使得它成爲很多更易於重複使用此代碼。

相關問題