2013-08-29 34 views
0

我需要在RAM中保留一些設置。我創建的文件「cache_values.py」django運行時的交替設置

class CacheValue: 
    pass 

我想用它作爲我的需求的變量容器。

我在寫一篇服務器啓動的一些設置爲「CacheValue」:

from cms.models.pagemodel import Page 
from modifier.cache_values import CacheValue 

def cache_start_values(): 
    CacheValue.page_publish_dates={} 

    pages=Page.objects.all() 
    for page in pages: 
     CacheValue.page_publish_dates[page.pk]=page.last_publish_date 

    CacheValue.last_publish_date=max(CacheValue.page_publish_dates.values()) 

此外,當我節省了一些模型 - 我更改這些設置

CacheValue.page_publish_dates[self.pk]=self.last_publish_date 
CacheValue.last_publish_date=max(CacheValue.page_publish_dates.values()) 

但是,當我想在我的模板中使用這些設置,通過將上下文處理器添加爲變量 - 一些魔法開始。

from modifier.cache_values import CacheValue 
def add_for_cache_info(request): 
    context_extras = {} 
    context_extras['page_publish_dates']=CacheValue.page_publish_dates 
    context_extras['last_publish_date_all_pages']=CacheValue.last_publish_date 
    if "current_page" in request.__dict__: 
     context_extras['last_publish_date']=CacheValue.page_publish_dates[request.current_page.pk] 

    return context_extras 

在模板

{{ page_publish_dates }} 
    {{ last_publish_date_all_pages }} 

價值觀,我在渲染模板交替看到舊之間(模型前保存)和新(型號後保存)每次我refersh的頁面。 0_0 0_0

如果我第二次保存模型(更改值) - 它將在最舊值和新值之間進行替換。

爲什麼?

回答

2

多個Django進程正在運行,並都有自己的CacheValue,一個與所討論的值複製每一個過程,但大部分沒有。改爲使用Django's cache framework

+0

正確答案 - 具有多個線程的多個進程會導致類似的問題。緩存框架在這裏是不錯的選擇,但不要使用[本地內存緩存](https://docs.djangoproject.com/en/dev/topics/cache/#local-memory-caching)後端,因爲它不能共享流程。還有一些分佈式協調的解決方案(比如Zookeeper),但它們相當具有殺傷力。 Memcached或一些鍵值存儲的外觀也像一個,但很難找到其他可靠的替代方案。 – Tadeck

+0

所以,據我所知,沒有辦法保持內存在運行時改變設置,只使用python變量和類。我對嗎? – 124bit

+0

我在問,因爲我不想使用memcache來存儲日期,並等待我從那裏獲得 – 124bit