Найти - Пользователи
Полная версия: django+mod_python, кэширование?
Начало » Django » django+mod_python, кэширование?
1
CombatPenguin
Здраствуйте, все!
После сдачи проекта отгреб проблемку.
Небольшой портальчик, несколько разных блоков и лента новостей.
Все работает замечательно, но бывает что после добавления, например, новости (модель ниже),
она не отображается на странице длительное время, вплоть до рестарта/релоада апача

model.py:
class News(models.Model):
title = models.CharField("Заголовок", maxlength=250)
category = models.ForeignKey(NewsCategories, verbose_name="Категория")
preview = models.TextField("Сокращенный вариант")
body = models.TextField("Полный текст")
created = models.DateTimeField("Добавлена", auto_now_add=True)
hot = models.BooleanField("Горячая новость")
views.py кусок для выборки только горячих новостей:
context = {
'hot_news': News.objects.filter(hot=True).order_by('-created')[0],
}
return render_to_response('index.html', context)
пробовал отключать кэш, CACHE_BACKEND = ‘dummy:///’
результат тот же

смотрел какие запросы делает джанго в базу, так вот конкретно тех, что не обновляются - нет, корректно обновляются только те блоки, где идет выборка диапазона значений, например:
    context["news_list"] = News.objects.filter(hot=False).order_by('-created')[:5]
в какую сторону копать? может это mod_python выпендривается?
джанго выкачал по свн, версия из транка
playpauseandstop
Controlling cache: Using other headers
Django documentation
If you want to use headers to disable caching altogether, django.views.decorators.cache.never_cache is a view decorator that adds headers to ensure the response won’t be cached by browsers or other caches. Example:
from django.views.decorators.cache import never_cache
@never_cache
def myview(request):
    ...
другими словами у вас кешуриется именно клиентский код (не установленны необходимые <meta /> теги), а не серверный
CombatPenguin
в шаблоне присутствуют теги:
<meta http-equiv=“Pragma” content=“no-cache” />
<meta http-equiv=“cache-control” content=“no-store, no-cache, must-revalidate” />
CombatPenguin
я так понял, все проблема в том, что я определил словарь context глобально… не хотелось множить один и тот же код для каждой вьюхи
а при использовании mod_python глобальные переменные вычисляются один раз при запуске
подскажите, пожалуйста, как правильно сделать?

вот пример из views.py:
context = {
'hot_news': News.objects.filter(hot=True).order_by('-created')[0],
'last_radio_message': VisualRadio.objects.all().order_by('-created')[0],
'last_totals': Totals.objects.all().order_by('-created')[0],
'last_poll': Poll.objects.all().order_by('-created')[0],
}

def index(request):
context["hot_news"] = News.objects.filter(hot=True).order_by('-created')[0]
context["news_list"] = News.objects.filter(hot=False).order_by('-created')[:5]
return render_to_response('index.html', context)

def news(request, news_id):
context["news"] = get_object_or_404(News, id=news_id)
return render_to_response('news.html', context)
в шаблоны нужно всегда передавать то, что определено в словаре context
playpauseandstop
context_processors не помогут отцу русской демократии?

Subclassing Context: RequestContext
Django documentation
The second difference is that it automatically populates the context with a few variables, according to your TEMPLATE_CONTEXT_PROCESSORS setting.
в Вашем случае это может выглядеть как:
context_processors.py
def something(request):
    return {
        'last_radio_message': VisualRadio.objects.all().order_by('-created')[0],
        'last_totals': Totals.objects.all().order_by('-created')[0],
        'last_poll': Poll.objects.all().order_by('-created')[0],    
    }
views.py
def index(request):
    return render_to_response('index.html', {
        'hot_news': News.objects.filter(hot=True).order_by('-created')[0],
        'news_list': News.objects.filter(hot=False).order_by('-created')[:5],
    }, context_instance=RequestContext(request))
def news(request, news_id):
    news = get_object_or_404(News, id=news_id)
    return render_to_response('news.html', {
        'news': news,
    }, context_instance=RequestContext(request))
ну или, если контекст процессоры не подходят - можно использовать декоратор, как, например, render_to от piranha
CombatPenguin
Спасибо всем! Я написал свои теги для каждого блока, это решило проблему :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB