Проблемы с использованием как счетчика просмотров страниц, так и кеша в django

Я создаю приложение django для комиксов и имею код в моем views.py такого приложения:

@comic_inc
@cache_page(settings.CACHE_S) //CACHE_S = 60
@vary_on_cookie
def comic(request, com):
    try:
        cobj = Comic.gen_comic(com, request.user.id)
        if request.GET.get('sort') == '2':
            chaps = Chapter.objects.filter(published=True, comic = cobj).order_by('num','snum','volume')
        else:
            chaps = Chapter.objects.filter(published=True, comic = cobj).order_by('-num','-snum','-volume')
        return render(request, 'base/comic.html', {'comic': cobj, 'chapters':chaps})
    except Exception as e:
        return render(request, 'base/comic.html', {'error': 'Comic not found'})

@comic_inc — это декоратор, который я создал, когда пытался реализовать это решение: Подсчет просмотров страниц или обращений при использовании кеша

код декоратора выглядит следующим образом:

def comic_inc(view_func):
    def _wrapped(*args,**kwargs):
        Comic.objects.filter(slug=kwargs.get('com')).update(pageviews=F('pageviews')+1)
        return view_func(*args,**kwargs)
    return _wrapped

Я специально не указывал никаких CACHE в настройках django, так как уже есть кеш по умолчанию django.core.cache.backends.locmem.LocMemCache, который отлично подходит для разработки (правильно отображается на панели инструментов отладки) . Кроме того, я попробовал memcached (скачал и запустил memcached -m 512 -vvv в CMD, и он отлично работал).

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

Пожалуйста помогите.


person yashas123    schedule 19.02.2019    source источник
comment
Используете ли вы какое-либо промежуточное ПО, связанное с кэшированием, или что-то еще определено в вашем urls.py?   -  person Bernhard Vallant    schedule 19.02.2019
comment
Ничего особенного в urls.py Использование этого в промежуточном программном обеспечении 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware'   -  person yashas123    schedule 19.02.2019
comment
Вам следует удалить промежуточное ПО и просто использовать cache_page: docs .djangoproject.com/en/2.1/topics/cache/#the-per-view-cache   -  person Bernhard Vallant    schedule 19.02.2019
comment
вау... просто вау... и это исправлено просто так.... поэтому я не могу использовать и cache_page, и промежуточное ПО... я думал, что промежуточное ПО должно истечь кеш, чтобы обновить его...   -  person yashas123    schedule 19.02.2019
comment
я опубликую это как ответ ;)   -  person Bernhard Vallant    schedule 19.02.2019


Ответы (1)


Удалите все промежуточное ПО, связанное с кэшированием, из вашего settings.py, если вы хотите использовать декоратор cache_page таким образом. Промежуточное ПО будет отвечать за простое кэширование всего сайта. а декоратор полезен для больше настраиваемое кэширование страницы/представления.

person Bernhard Vallant    schedule 19.02.2019
comment
Кроме того, у меня есть что-то вроде функции закладок, которая позволяет пользователям делать закладки и следить за ними для уведомлений об обновлениях, но кеш не истекает и не пересчитывает его, когда они добавляют его в закладки, пока не истечет время, поэтому даже после того, как они нажмут на закладку кнопка страница обновляется и снова показывает кнопку добавления в закладки (я установил ее так, что если она добавлена ​​в закладки, кнопка не должна отображаться, и она проверена должным образом), должен ли я использовать частичное кэширование шаблона здесь или что-то еще? не могли бы вы просто прокомментировать это или отредактировать свой ответ или что-то в этом роде? - person yashas123; 19.02.2019
comment
Угадайте, что есть несколько способов решить эту проблему... Cahe только части шаблона/ответа, отключить кеширование для зарегистрированных пользователей, посмотреть на различные... декораторы (например, вы можете использовать изменить файл cookie и установить файл cookie) , установите значение в сеансе и зависите от этого кеширования... - person Bernhard Vallant; 19.02.2019
comment
Могу ли я использовать кеширование как отдельного представления, так и частичного кеша шаблона для кешированного представления? - person yashas123; 19.02.2019