2017-09-15 5 views
1

私の見解を良くするためにDjangoキャッシュを使用しようとしています。素晴らしい作品、400ms〜8msは完璧です。しかし、ユーザーアクセスページで初めて、Djangoキャッシュページにヘッダーにユーザー情報があり、ログアウトしようとすると、ページにユーザー情報が続きます。Djangoキャッシュをキャッシュなしですべてのページで表示する方法

私もテンプレートでキャッシュを使用してみましたが、良くないです、私の問題はビューから来て、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はここに必要なものです。変更できるテンプレートの部分については、あなたが一意(Django docsから)それを識別するための{% cache %}タグに引数を追加することができます:{% cache %}タグで

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

すべてが今、あなたドンので、ユーザーごとにキャッシュされます1人のユーザーが別のユーザーのヘッダーを見ているという状況になります。

+0

しかし、私の問題はビューから来ています。テンプレートキャッシュを使用して400msを続行します。 –

+0

@GuilhermeIA Tirzonoからのコメントは、AJAXを介してユーザー情報を引き出し、残りのビューと共にキャッシュされないようにすることを示唆しています。テンプレートキャッシングが十分でない場合、それはあなたの最善の策のように思えます。 – Franey

関連する問題