обработка условного представления кеша django latest_entry - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть модель с именем aps

class aps(model.Model):
    u=models.ForeignKey(User, related_name='u')
    when=models.DateTimeField() #datetime when row was inserted
    a=models.ForeignKey(User, related_name='a')
    a_read=models.BooleanField()
    a_last_read=models.DateTimeField()

Записи из aps извлекаются так:

def displayAps(request, name)
    apz=aps.objects.order_by('-when').filter(u=User.objects.get(username=name))
    return render_to_response(template.html, {'apz':apz})

И далее они отображаются в template.html ...

То, чего я пытаюсь достичь, это то, что django docz упоминает здесь об обработке условного представления

Я делаю что-то вроде:

def latest_entry(request, name):
    return aps.objects.filter().latest('when').when

@cache_page(60*15)    
@last_modified(latest_entry)
def displayAps(request, name)
    apz=aps.objects.order_by('-when').filter(u=User.objects.get(username=name))
    return render_to_response(template.html, {'apz':apz})

Если новые строкидобавляются содержимое не изменяется, но извлекается из кэша.Мне нужно удалить файлы кэша и «обновить обновление» браузера, чтобы увидеть новые строки.

Кто-нибудь видит, что я здесь делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Если вы возьмете cache_page декоратор, он работает?

Декоратор cache_page - это первый фрагмент кода, который фактически вызывается в вашей функции просмотра. Он проверяет временную метку и возвращает кэшированные данные, как и положено. Если срок действия кэша не истек, декоратор last_modified не будет вызываться.


В любом случае, вы, возможно, захотите быть более внимательным к смешиванию обработки условных ответов и статического кэширования. Они выполняют похожие вещи, но используют совершенно разные механизмы.

cache_page говорит django использовать представление только для отображения фактического ответа каждые n секунд. Если до этого поступит другой запрос, то же обработанное содержимое будет возвращено клиенту - независимо от того, является ли оно устаревшим или нет. Это снижает нагрузку на ваш сервер, но ничего не делает для уменьшения пропускной способности.

last_modified обрабатывает случай, когда клиент говорит: «У меня есть версия этой страницы, которая такая старая; она все еще хороша?» В этом случае ваш сервер может проверить базу данных и выдать очень короткий ответ «Это все еще хорошо», если база данных не изменилась. Это значительно сокращает ваши потребности в пропускной способности для этих случаев, но вам все равно нужно обратиться к базе данных, чтобы определить, устарел ли кеш клиента или нет, поэтому нагрузка на ваш сервер может быть почти такой же.

Как я уже упоминал выше, вы не можете просто применить cache_page перед last_modfied - если база данных изменилась, cache_page не узнает об этом. Хуже того, если время ожидания кэша истекло , но база данных не изменилась, вы можете в конечном итоге кэшировать сообщение «304 Не изменено» и отправлять , что для всех последующих посетителей. в течение следующих пятнадцати минут.

Вы можете применять декораторы в другом порядке, но вы должны делать запрос из базы данных для каждого запроса, и вы все равно можете попасть в ситуацию, когда база данных изменилась, но кэш не истек - в этом случае клиент все еще может получать старую версию страницы, даже если сервер уже коснулся базы данных, чтобы определить, что она обновлена.

0 голосов
/ 01 апреля 2015

Фильтр зависит от какого-либо зарегистрированного пользователя или чего-то еще, вы должны идентифицировать этого пользователя в куки и использовать django var_on_cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...