2011-03-20 52 views
1

不確定是否有人有過使用django專門爲移動設備呈現模板的良好解決方案的經驗。移動瀏覽器的django視圖/模板重定向

我寫了一箇中間件請求處理器,使用正則表達式來檢測它是否是移動瀏覽器。我現在正在請求上設置一個布爾屬性,以便我可以在管道中使用它。但是我的業務邏輯是相同的,我只想使用一組不同的模板。

有沒有辦法讓我在中間件處理器中爲settings.TEMPLATE_DIRS添加一個新的模板目錄,以便移動用戶可以獲得我選擇重寫的視圖,但其他一切都會回退到默認模板目錄。但我需要確保它不會在請求之間持續。

如果我添加了一個目錄,設置是否會在請求之間持續保存?

..如果是這樣,這是正確的解決方案(檢查瀏覽器代理,添加一個額外的模板文件夾,然後在每個請求結束時刪除它)?

回答

2

動態修改模板搜索路徑是處理此問題的好方法。定義自己的模板加載器並將其添加到settings.py中的TEMPLATE_LOADERS並不難。其中棘手的部分是處理您可能在多線程環境中運行的事實,並且您沒有辦法將請求直接傳遞給模板加載器。

解決方法是將請求,標誌或簡單的目錄存儲到線程局部變量的路徑中,並從自定義模板加載器中引用該線程局部變量。這裏有一個關於創建模板加載器的blog post,我可以證實它非常簡單並且可行。這裏有一個even better one關於做你需要的東西。

我想我沒有具體指出你可能不想嘗試改變settings.TEMPLATE_DIRS每個請求,你會得到最好的結果。

+0

當我在load_template_source函數中時,我將如何訪問局部變量?或者我如何設置一個本地變量,我可以在加載程序中訪問 – MattoTodd 2011-03-20 04:25:06

+0

threadlocal實際上是一個全局變量,所以它「只是在那裏」,但您可以確信只會獲得與當前正在執行的請求相關的變量。這裏有很多細節http://stackoverflow.com/questions/1057252/django-how-do-i-access-the-request-object-or-any-other-variable-in-a-forms-clea – easel 2011-03-20 04:27:52

+0

This博客文章有這一切。我將它添加到答案中。 http://opensource.washingtontimes.com/blog/2010/feb/17/loading-templates-based-request-headers-django/ – easel 2011-03-20 04:31:33