2016-07-28 145 views
1

我使用django的内置缓存与@cache_page装饰器。但是,我希望自动刷新缓存,以便刷新不会因用户的实际页面请求而触发,从而导致延迟。自动刷新缓存

想到一个明显的策略是使用芹菜任务。我有两个问题请:

  1. 如果芹菜任务方法是可以接受的,我需要什么代码a)触发刷新和b)未知数量的页面,例如, myapp.com/products/?page=2,myapp.com/products/?page=3(我无法预测页数)
  2. 有没有更好的方法?

回答

0

我最终编写了一个使用requests框架的芹菜任务,每小时刷新缓存 - 它也处理分页。示例代码:

@shared_task 
def refresh_caches(): 
    header = {"Content-Type": "application/json; charset=utf-8", 
         "Authorization": settings.USER_TOKEN} 

    next_page_url = settings.API_URL +'/products/' 
    while len(next_page_url) > 0: 
     response = requests.get(next_page_url, headers=header) 
     next_page_url = '' 
     jsonresponse = response.json() 
     if jsonresponse.get('next'): 
      next_page_url = jsonresponse['next'] 
0

我认为这是一个芹菜任务是一个矫枉过正。有一个定义缓存过期的设置:

CACHE_MIDDLEWARE_SECONDS - 每个页面应该被缓存的秒数。

参考:Django docs

这已在1.8推出,并影响@cache_page时间。不要将它与用于使用缓存功能的CACHES: TIMEOUT设置混淆,例如cache.set()。更多关于这个here

+0

我明白缓存超时。我想要阻止的是用户启动的请求刷新缓存导致延迟 - 我想手动触发缓存刷新。 – RunLoop

+0

@RunLoop我明白了。我的理解是用户请求不应该扩展缓存,它将在设置后到期'CACHE_MIDDLEWARE_SECONDS',但我们需要挖掘代码来确认这一点。这是一个问题,虽然你甚至不需要甚至需要手动过期。 – Wtower