2011-04-07 47 views
1

我有一個'實時設置'應用程序,我用它來存儲某些全球網站設置。我的網站的某些頁面引用了這些設置,但通常它們一次只能使用2-3個。我訪問使用自定義模板標籤這些設置,像這樣:Django - 預渲染信號?

{% settings site_name %} 

每次我用這個標籤,該模型將檢索數據庫中的設置,所以如果我有這樣的事情:

{% settings site_name %} {% settings num_articles %} 

數據庫將被查詢兩次。

我想要做的不是每頁多於一次的數據庫設置值,如果我可以獲取頁面上使用的所有設置,然後點擊數據庫檢索它們,那將是好多了。

我看了一遍文檔,看起來Django沒有預渲染信號,我可以用它來更新對設置的任何引用,所以有沒有人有任何建議,我可以優化這個系統?是的,顯然緩存是顯而易見的答案,但我仍然希望在頁面未被緩存時對此進行改進。

回答

1

同意丹尼爾process_template_response是你正在尋找的鉤子。我不知道你有多少設置,但它也可以檢索所有設置一次,並將它們存儲在結構等字典中,以便隨時訪問它們而不必訪問數據庫。你可以根據請求檢索它們,或者 - 即使你的設置幾乎沒有改變 - 當Django初始化時。您還可以使用django的信號在刪除或更新時更新您的緩存設置。

如果你看看django-dbsettings你會看到它做了類似的事情!

+0

process_template_response很酷,但這意味着我不得不改變我編碼我的意見,這是不理想的方式... render_to_response是如此的整潔。我想我只需要在django初始化時設置它們。 – Hanpan 2011-04-07 09:18:04

1

Django 1.3包含新的TemplateResponse類,它允許您稍後在渲染過程中修改響應 - 例如在middleware中。這看起來可能會做你想做的。

0

如果你想堅持一個類似於你已經有的方案,我會實現一個過濾器,它接受一個鍵列表並返回一個包含所有相關值的字典。

實施例過濾器:

def get_settings(key_list): 
    # take values from conf.settings. In practice, can be from any source 
    return dict((k, getattr(settings, k, None)) for k in key_list.split(",")) 
register.filter("get_settings", get_settings) 

用法:

{# load multiple values with a single call #} 
{% with "KEY1,KEY2"|get_settings as settings %} 
    setting values {{ settings.KEY1 }} and {{ settings.KEY2 }} 
{% endwith %} 

注意,我使用的過濾器,而不是一個標籤,因爲with內置預計as前一個值。