2017-09-15 57 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

相關問題