2013-03-11 88 views
0

只是在這裏尋找一些關於如何在「Django時尚」中實現這個概念的指導。Django查看預處理

我正在使用dbsettings來定義站點級變量。在每個請求中,我想檢查一個站點級變量,並根據該變量的值呈現不同的響應。

現在我意識到我只需在每個視圖函數中添加一個簡單的if語句就可以輕鬆完成此任務,但我認爲可能有一種方法可以將其應用於更高級別的應用程序中?

讓我知道是否有辦法在所有請求中「全局化」此功能。謝謝。

回答

1

實際上,如果設置將影響首先選擇的模板或實質上影響響應,那麼您真的可能需要的是middleware。這比使用模板上下文處理器更靈活,如果您只是想將幾個變量添加到上下文中,則更合適。

您在創建自己的應用middleware.py,這可能包含這樣的內容:

from django.conf import settings 

class MyMiddleware(object): 
    def process_request(self, request): 
     request.my_app_setting = settings.MY_APP_SETTING 

不要忘了你的類添加到您的MIDDLEWARE_CLASSES設置。

+0

對自定義視圖裝飾器有什麼想法? – andersra 2013-03-12 03:27:06

+0

似乎不太乾我。你可以帶上一點鹽,但是我個人會在沒有完全必要時避免裝飾者。我喜歡它們,它們是一個非常強大的工具,但它們也可以使代碼變得更加神祕。我看到一個,我想,現在這個功能可能已經成爲陽光下的任何東西。另一方面,中間件的目的更多地侷限於你的確切類型的問題,缺點是有點「不可思議」。但是很明顯,隨機請求屬性必須來自中間件。 – acjay 2013-03-12 06:56:49

+0

有了這個中間的解決方案,我沒有看到你在哪裏獲得DRY優勢。在視圖中,我仍然必須檢查request.my_app_setting,然後適當地重定向否?或者我可以檢查此MyMiddleware對象中的request.my_app_setting的值,並相應地重定向? – andersra 2013-03-12 21:35:34

0

您可以使用自定義template context processors將「全局」上下文傳遞給您的視圖。

要做到這一點,請在您的應用程序的某處創建一個新的contextprocessors.py,其代碼類似於下面的示例(它只需要返回一個字典)。然後使用settings.py中的函數TEMPLATE_CONTEXT_PROCESSORS元組中的函數添加路徑(即:yourapp.contextprocessors.resource_urls)。

from django.conf import settings 

def resource_urls(request): 
    """Passes global values to templates.""" 

    return dict(
     TIME_ZONE = settings.TIME_ZONE, 
    ) 

現在您可以按照預期在模板中引用這些鍵:{{ TIME_ZONE }}