簡體   English   中英

Django-上下文處理器的惰性結果

[英]Django - Lazy results with a context processor

我正在django項目中工作,該項目要求大多數公共頁面數據都是動態的。 每個頁面上顯示的內容(例如電話號碼,地址,主要聯系人電子郵件等)都需要通過管理面板進行編輯,因此將其存儲在settings.py文件中將無法正常工作。

為了解決這個問題,我創建了一個自定義上下文處理器,該處理器充當對“實時設置”模型的抽象引用。 該模型如下所示:

class LiveSetting(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255, blank=False, null=False)
    description = models.TextField(blank=True, null=True)
    key = models.CharField(max_length=100, blank=False, null=False)
    value = models.CharField(max_length=255, blank=True)

上下文處理器如下所示:

from livesettings.models import LiveSetting

class LiveSettingsProcessor(object):
    def __getattr__(self, request):
        val = LiveSetting.objects.get(request)
        setattr(self, val.key, val.value)
        return val.value

l = LiveSettingsProcessor()

def livesetting_processors(request):
    return {'settings':l}

它的工作原理非常好,在我的模板中,我可以使用{{settings.primary_email}}並從數據庫中獲取相應的值。

上面的代碼的問題在於,它分別處理每個實時設置請求,並且每次在模板中使用我的{{settings。*}}標記時都會訪問數據庫。

是否有人知道我是否可以讓此過程變得懶惰,所以與其檢索值並返回它,不如更新一個QuerySet然后在呈現頁面之前一鍵返回結果?

您正在嘗試發明一些復雜的東西,而這並不是這樣做的原因。 像這樣簡單的事情可以使您足夠好:

def livesetting_processors(request):
    settings = LiveSetting.objects.get(request)
    return {'settings':settings}

編輯:

這是解決當前實施中問題的方法:

class LiveSettingsProcessor(object):
    def __getattr__(self, request):
        val = getattr(self, '_settings', LiveSetting.objects.get(request))
        setattr(self, val.key, val.value)
        return val.value

@韓盤,我已經更新了答案,顯示了如何解決問題,但是我想說的是,您要實現的目標並沒有取得任何實際的成功,但是它增加了復雜性,這需要花費時間。 稍后可能很難在所有這些上設置緩存。 啟用緩存后,這根本不會改善性能。

我不知道您是否曾聽過:過早的優化是邪惡的根源。 我認為SO上的該線程對於閱讀很有用: https : //stackoverflow.com/questions/211414/is-premature-optimization-really-the-root-of-all-evil

也許您可以嘗試使用Django的緩存

特別是,您可能想查看低級緩存功能 似乎工作量比您計划的要少得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM