Уведомления

Группа в Telegram: @pythonsu

#1 Июль 2, 2008 14:11:01

CombatPenguin
От:
Зарегистрирован: 2008-05-19
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

django+mod_python, кэширование?

Здраствуйте, все!
После сдачи проекта отгреб проблемку.
Небольшой портальчик, несколько разных блоков и лента новостей.
Все работает замечательно, но бывает что после добавления, например, новости (модель ниже),
она не отображается на странице длительное время, вплоть до рестарта/релоада апача

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 выпендривается?
джанго выкачал по свн, версия из транка



Офлайн

#2 Июль 2, 2008 14:57:44

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

django+mod_python, кэширование?

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 /> теги), а не серверный



Офлайн

#3 Июль 2, 2008 15:17:10

CombatPenguin
От:
Зарегистрирован: 2008-05-19
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

django+mod_python, кэширование?

в шаблоне присутствуют теги:
<meta http-equiv=“Pragma” content=“no-cache” />
<meta http-equiv=“cache-control” content=“no-store, no-cache, must-revalidate” />



Офлайн

#4 Июль 2, 2008 16:49:25

CombatPenguin
От:
Зарегистрирован: 2008-05-19
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

django+mod_python, кэширование?

я так понял, все проблема в том, что я определил словарь 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



Офлайн

#5 Июль 2, 2008 17:29:13

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

django+mod_python, кэширование?

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



Офлайн

#6 Июль 3, 2008 16:53:02

CombatPenguin
От:
Зарегистрирован: 2008-05-19
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

django+mod_python, кэширование?

Спасибо всем! Я написал свои теги для каждого блока, это решило проблему :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version