2017-09-15 59 views
1

我试图使用Django缓存来改善我的视图。很棒的作品,400毫秒到8毫秒是完美的。但是,当用户第一次访问页面时,Django缓存带有用户信息的页面,当我尝试注销时,页面会继续显示用户信息。如何在不缓存所有页面的情况下使用Django Cache

我也尝试在模板中使用缓存,但不好,我的问题来自视图,所以继续400ms。

settings.py

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
     'LOCATION': 'unique-snowflake', 
    } 
} 

view.py

@cache_page(60 * 15) 
def list(request, tag_slug=None): 
    page = request.GET.get('page') 
    data = questions_controller.list_questions(request, tag_slug, None, page) 
    if data: 
     return render(request, 'questions/list.html', data) 
    return page_not_found(request, "Page not found") 
+1

您能否提供一些关于如何在当前视图中使用缓存的示例代码? – Tirzono

+0

编辑..谢谢 –

+0

看看这个答案:https://stackoverflow.com/a/11703958/3342089 – Tirzono

回答

2

我面临与per-view缓存相同的问题。第一个缓存用户的用户信息显示给所有用户。我不能使用Template caching,因为它很慢。

最佳方法是使用low-level cache API缓存视图的最终结果。如果数据是动态的,则使用django-signals清除陈旧的缓存数据。根据您的要求调整下面的代码。

浏览:

from django.core.cache import cache  
def sample(request): 
     cached_data = cache.get_many(['query1', 'query2']) 
     if cached_data: 
      return render(request, 'sample.html', {'query1': cached_data['query1'], 'query2': cached_data['query2']}) 
     else: 
      queryset1 = Model.objects.all() 
      queryset2 = Model2.objects.all() 
      cache.set_many({'query1': queryset1 , 'query2': queryset2 }, None) 
      return render(request, 'sample.html', {'query1': queryset1 , 'query2': queryset2}) 

型号:

from django.db.models.signals import post_save 
from django.core.cache import cache 

@receiver(post_save, sender=Model1) 
@receiver(post_save, sender=Model2) 
def purge_cache(instance, **kwargs): 
    cache.delete_many(['query1', 'query2']) 

希望这有助于。

-1

按次缓存将缓存整个视图,所以这是一个非常适合像一个接触页面,但它不适合具有动态内容的视图。

听起来像template caching是你需要在这里。对于模板的部分,可以改变,你可以将参数添加到{% cache %}标签唯一标识(从Django docs):

{% load cache %} 
{% cache 500 header request.user.username %} 
    .. header for logged in user .. 
{% endcache %} 

{% cache %}标签一切现在将缓存每个用户的,所以你不要最终会出现一个用户正在看到另一个用户的标题的情况。

+0

但我的问题来自于视图。使用模板缓存继续400毫秒。 –

+0

@GuilhermeIA Tirzono的评论建议通过AJAX提取用户信息,这样它就不会与其余视图一起缓存。如果模板缓存不够,那听起来就像是你最好的选择。 – Franey

相关问题