在Django中同时使用页面视图计数器和缓存的问题

时间:2019-02-19 15:26:47

标签: django django-cache

我正在为漫画创建一个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是我在尝试实现此解决方案时创建的装饰器:Counting "page views" or "hits" when using cache

装饰器代码如下:

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

我没有在django设置中特别指定任何CACHE,因为已经有一个默认缓存 django.core.cache.backends.locmem.LocMemCache 对于开发来说非常合适(正确显示在调试工具栏中)。另外,我确实尝试了memcached(在CMD中下载并运行memcached -m 512 -vvv,效果很好)。

两种方法的结果都是相同的,只有在缓存的页面超时时,页面浏览量才会更新,并且只会增加1。我不介意缓存的模板页面上的每次刷新都不会更改视图值,但我至少希望在后端增加值。我确实通过在模板上刷新约20次,然后检查管理面板并等待超时并再次刷新来验证网页浏览量的值是否正在更改,但是该值没有增加超过1。

请帮助我。

1 个答案:

答案 0 :(得分:1)

如果要使用settings.py装饰器,请从cache_page中删除所有与缓存相关的中间件。中间件将负责easy site-wide caching,而装饰器则负责more configurable page/view-specific caching