Django:如何处理Ajax请求不同的视图中的缓存?

Ric*_*ard 2 django memcached django-cache django-queryset

我有一个Django应用程序和一个postgres后端.它本质上是一个拥有大型数据库的搜索站点,数据通常每天更改一次.我想开始缓存,以减少数据库的负载.

我已经设置了memcached,但我的视图中有以下架构,旨在让我的应用程序在前端使用Ajax:

@cache_page(60 * 60 * 12)
def items(request, pattern=None, specialurl=None):
  if request.is_ajax():
    template = "result_ajax.html"
  else: 
    template = "index.html"
Run Code Online (Sandbox Code Playgroud)

..并且不幸的是,缓存加上Ajax调用的特殊处理组合效果不佳.

这是因为memcached没有区分Ajax结果和非Ajax结果 - 因此来自前端的Ajax调用被赋予缓存的非Ajax结果,反之亦然.

所以我需要做的是弄清楚如何缓存.我可以想到以下选项:

  1. 仅缓存数据库查询,一次最多一天.这可能吗?
  2. result_ajax.html实际显示结果的范围内缓存模板的片段.(index.html实际上包括result_ajax.html.)

哪些可能是最好的做事方式?

Nic*_*tot 5

我会尝试这样的事情告诉缓存装饰器为Ajax和非Ajax请求使用不同的缓存键:

from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_headers

@cache_page(60 * 60 * 12)
@vary_on_headers('X-Requested-With')
def items(request, pattern=None, specialurl=None):
  if request.is_ajax():
    template = "result_ajax.html"
  else: 
    template = "index.html"
Run Code Online (Sandbox Code Playgroud)