我正在開發我的網站的移動版本,所以想到使用用戶代理作爲爲移動版和網頁版提供不同模板的標準。 我成功地從nginx讀取用戶代理信息並將其作爲頭傳遞給gunicorn服務器。基於django中的用戶代理的移動模板確保線程安全
然後我創建了一箇中間件,它讀取這個頭文件並更改設置文件中的templates目錄。這似乎最初工作,但後來我意識到有競爭狀況發生,因爲這種方法不是線程安全的。 (我應該事先想到它)。
所以我開始考慮其他的選擇。一種解決方案是覆蓋django的渲染方法,以包含基於請求頭的「dirs」參數。但後來我發現「dirs」參數已被棄用。以下是參考鏈接https://docs.djangoproject.com/en/1.9/_modules/django/shortcuts/#render 所以即使這不起作用。
另一種解決方案是針對移動設備和網絡使用不同的模板名稱並相應地加載它們。但我不想這樣做,並希望保持模板目錄結構完全相同的網絡和移動。
必須有一種方法來覆蓋模板目錄。如果在移動模板目錄中缺少這個模板,這將使我在Web版本的模板上回落。
任何建議如何實現這將是有益的。
這就是我的模板組織方式。
App1
templates
App1
index.html
catalog.html
App2
templates
App2
about.html
,並在項目目錄(而不是應用程序文件夾的一部分),有一個移動模板文件夾,其具有以下結構
mobile-templates
App1
index.html
App2
about.html
感謝 阿努拉格
如何修改'request'對象來添加目錄名?然後'render'可以通過附加路徑到這個'request.template_dir'變量來渲染文件。 – sudshekhar
@SudhanshuShekhar - 即使我修改了請求對象,render函數將如何自動獲取目錄名稱?我也檢查了源代碼,並沒有發現render.template_dir被渲染函數使用。不知道我是否錯過了一些東西,請澄清。 如果您的意思是在我的渲染函數中預先追加目錄名稱,那麼在Web版本上回落將不起作用。 – Anurag
我正在考慮類似於:'render(request,[「app/template/t_mobile.html」,「app/template/t.html」],context)'。您可以使用'request.template_dir'來決定是否添加't_mobile.html'作爲選項。 – sudshekhar