2013-08-29 4 views
0

Мне нужно сохранить некоторые настройки в ОЗУ. Я создал файл «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

Итак, как я понимаю, нет никакого способа постоянно изменять настройки во время выполнения в ram, используя только переменные и классы python. Я прав? – 124bit

+0

Я спрашиваю, потому что я не хочу использовать memcache для хранения только даты и ждать, когда я получу его оттуда – 124bit

Смежные вопросы