django缓存REST API URL问题

时间:2017-06-05 06:51:50

标签: django curl django-rest-framework django-cache django-caching

我已按照Stack overflow Link&中提供的解决方案进行操作。当我在浏览器中使用它时它工作得很好。但是,当我尝试使用curl点击该URL时,它不会为浏览器缓存..

让我解释一下。

  

如果我从我的Chrome中点击了example.org/results?limit=7这样的网址,那就是了   需要8-10 seconds加载&连续点击需要时间   milliseconds

所以我所做的就是用URL命令调用curl;但它没有使用缓存数据&再次创建缓存。

所以我发现问题在于下面代码中的arg参数,因为它包含WSGIRequest对象中的浏览器标题,它正在缓存密钥中使用,因为它包含标题也是我的不要求缓存。这无法实现curl请求从celery task自动创建缓存的目的。

@method_decorator(cache_page(60 * 60 * 24))
def dispatch(self, *arg, **kwargs):
    print(arg)
    print(kwargs)
    return super(ProfileLikeHistoryApi, self).dispatch(*arg, **kwargs)  

我该怎么办才能只传递kwargs来创建缓存或任何其他替代方法,我只能通过它来缓存网址

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

TLDR;手动删除方法装饰器和缓存

from django.core.cache import cache
from django.utils.encoding import force_bytes, force_text, iri_to_uri
import hashlib

def dispatch(self, *arg, **kwargs):

    if self.request.method == 'GET' or self.request.method == 'HEAD':
        key = hashlib.md5(force_bytes(iri_to_uri(self.request.build_absolute_uri()))))
        data = cache.get(key)
        if not data:
            data = super(ProfileLikeHistoryApi, self).dispatch(*arg, **kwargs)  
            cache.set(key, data, 60*60*24)
            return data

   return super(ProfileLikeHistoryApi, self).dispatch(*arg, **kwargs)  

cache_page装饰器

是的,你是对的,缓存页面装饰器将根据标题决定要缓存的内容。但是,只有“vary”标题会产生影响。

其次只有GET和HEAD请求被缓存(和缓存),这就是为什么在上面的代码中我们首先检查方法。

MD5

您可能听说过时并且不安全。密码学可能也是如此,但在我们的案例中并不适用。这里使用的哈希生成方案与django _generate_cache_key使用的哈希生成方案完全相同,但我们忽略了方程式中的标题。

那个人得到一个慢页

每天都会有一个人因缓存过期而变慢页面。其他人都会得到过时的数据。数据时间长达23小时59分钟。

考虑运行后台进程或在后台运行此任务的cron说每6个小时并刷新缓存。

现在使用memcached可能有点困难,因为它没有提供一种简单的方法来查找具有特定模式的所有键,但如果你在数据库中使用redis或缓存,它就变得容易了。