LINUX.ORG.RU

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


0

0

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

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

maxlength и auto_now_add deprecated. # -*- coding: utf-8 -*- в начало файла и u'' для всех не ascii строк.

mod_python вообще ничего не кеширует. Джанго объект из базы достает всегда? В шаблон он передается? В шаблоне нет каких-нибудь хитрых хаков при выводе?

Как вариант попробуйте: News.objects.filter(hot=True).order_by('-created')[0:1].get()

anonymous
()
Ответ на: комментарий от anonymous

maxlength заменил на max_length, про auto_now и auto_now_add толком ничего не нашел :(

джанго не всегда достает объекты, в том и проблема

на гугле в группе django-users вот что мне ответили:

>When launched, mod_python loads your code once and only once for each server process, and holds it in memory afterward. This is a trade-off made or efficiency, because reloading the code on every request would significantly slow the server. As a result, whenever you make a change to code that runs under mod_python, you must also restart the web server.

>In addition, any variable assigned at the module global level will only be evaluated once, which means that any top-level variable declaration which does a database query will only evaluate once per server process, rather than appearing to refresh on each request.

я так понял, все проблема в том, что я определил словарь context глобально... не хотелось множить один и тот же код для каждой вьюхи

подскажите, пожалуйста, как правильно сделать?

Luigi
() автор топика
Ответ на: комментарий от Luigi

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],
}

# Create your views here.
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)

Luigi
() автор топика
Ответ на: комментарий от Luigi

Да, проблема именно в глобальности вашего context.

auto_now_add всегда была глючной штукой и ее давно планируют выкинуть
http://groups.google.com/group/django-developers/browse_thread/thread/4cd631c22
5cb4e52
Правильно теперь делается так:

import datetime
created = models.DateTimeField("Добавлена", default=datetime.datetime.now)

Если у вас News в большинстве случаев сортируется по '-created', то выгодно задать ее сортировкой по-умолчанию:

class News(models.Model):
    class Meta:
        ordering = ('-created',)

Вью:

from django.shortcuts import render_to_response
from django.template.context import RequestContext

def index(request):
    context = RequestContext(request, {
        'hot_news': News.objects.filter(hot=True)[0],
        'last_radio_message': VisualRadio.objects.all()[0],
        'last_totals': Totals.objects.all()[0],
        'last_poll': Poll.objects.all()[0],
        'news_list': News.objects.filter(hot=False)[:5]
    }
    return render_to_response('index.html', context)

Если у вас context постоянно повторяется, то выделите в отдельную функцию, сделайте context processor
http://www.djangoproject.com/documentation/templates_python/#subclassing-contex
t-requestcontext (и в гугле) или даже вообще свой тег.
А еще посмотрите в сторону http://www.djangoproject.com/documentation/generic_views/#django-views-generic-
simple-direct-to-template

anonymous
()
Ответ на: комментарий от anonymous

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

Luigi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.