[英]How use Django Cache in view without cache all page
我试图使用 Django 缓存来改善我的观点。 效果很好,400 毫秒到 8 毫秒是完美的。 但是当用户第一次访问页面时,Django 缓存页面中的用户信息在标题中,当我尝试注销时,页面继续使用用户信息。
我也尝试在模板中使用缓存,但不好,我的问题来自视图,所以继续 400ms。
我的设置.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
我的视图.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")
我在按视图缓存时遇到了同样的问题。 第一个缓存用户的用户信息显示给所有用户。 而且我不能使用模板缓存,因为它很慢。
最好的方法是使用低级缓存 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'])
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.