我尝试使用Django Cache来改善我的观点。效果很好,400ms到8ms是完美的。但是当第一次用户访问页面时,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")
答案 0 :(得分: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 :(得分:-1)
每个视图缓存将缓存整个视图,因此它非常适合某个类似联系人页面的内容,但它不适合具有动态内容的视图。
听起来template caching就是你需要的东西。对于可以更改的模板部分,您可以向Grid
标记添加参数以唯一标识它(来自Django docs):
{% cache %}
{% load cache %}
{% cache 500 header request.user.username %}
.. header for logged in user ..
{% endcache %}
标记中的所有内容现在都将按用户进行缓存,因此您不会遇到一个用户看到其他用户标题的情况。