2016-05-31 50 views
1

我在使用staticfiles管理Django應用程序中的靜態文件(JS,CSS,圖像等)。這工作正常,但我想在用戶瀏覽器可用時啓動dynamically serving pre-compressed sources在runserver中使用Django staticfiles進行內容協商

我經歷了鏈接教程,並在生產(在Apache)這工作正常。我可以用

<script src="/static/js/my-site"></script> 

包括文件,當gzip編碼支持它會加載在舊的瀏覽器my-site.jsmy-site.js.gz。大!但是:這使用runserver打破了本地開發。當然,staticfiles默認視圖不知道如何將/js/my-site轉換爲/js/my-site.js(或.gz)。要獲得runserver的工作,我需要指定擴展,它打破了內容協商。

是否有更好的方式來配置Apache,以便我總是可以請求.js(或.css等)並獲得透明壓縮版本?或者我可以告訴Django如何查找請求的資源而不指定擴展名?我不認爲我是唯一一個試圖做到這一點的人...

+0

作爲參考,我嘗試[一種替代解決方案](http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manually-pre-compressed-gz-file-of-css-and-js-files )使用'mod_rewrite',但對於我的生活,我無法得到它實際服務gzip'd文件。也許我需要一個關於'mod_rewrite'調試的單獨問題? – Coderer

回答

1

沒有簡單的解決方案。主要是因爲您使用的是僅爲apache web服務器設計的(afaik)。

我我看來有三種解決方案:

  1. 保留源{JS,CSS}在不同的目錄中的文件,在發展中你可以從源代碼目錄爲他們服務或壓縮一個 - 簡單,透明,就可以了。使用.min。{js,css}結尾壓縮文件
  2. - 不需要單獨的目錄,你可以在apache中隱藏源代碼(mod_rewrite)
  3. 編寫你自己的小型中間件,它將模擬apache所做的事情(這是幾行選擇和重寫路徑,你甚至可以有不同的根據DEBUG配置變種NT行爲)
  4. 使用一些動態的解決方案如Django Compressor這將彙編點播這些文件

(我使用選項4 :))

+0

其中一些並未完全解決該問題。我需要HTML中的* something *,以便從不支持gzip編碼的瀏覽器或可能的壓縮版本加載未壓縮的腳本。 OP提供的示例在Apache中提供服務時非常有用。 #1 /#4不提供這個。 #3可以工作,但學習編寫中間件現在不是優先考慮的事情。對於#2,正如我上面評論的那樣,我在使用mod_rewrite時遇到了問題,但從長遠來看,這可能是最有希望的途徑。 – Coderer

+0

imo如果瀏覽器不支持壓縮 - 你在請求中沒有標題,所以你不應該在它們上強制使用gzipped版本。 – Jerzyk

+0

準確地說 - 這就是爲什麼#1和#4不是一個完整的解決方案,你仍然需要一些東西檢查標題並決定要提供哪個版本,即使HTML只需要一個指定的資源。 – Coderer