【问题标题】:django cache REST API Urls issuedjango缓存REST API Urls问题
【发布时间】:2017-11-05 21:22:58
【问题描述】:

我遵循了Stack overflow Link 中提供的解决方案,当我在浏览器中使用它时,它运行良好。但是,当我尝试使用 curl 访问该 url 时,它不会为浏览器缓存..

让我解释一下。

如果我从我的 chrome 中点击像 example.org/results?limit=7 这样的网址,它 需要8-10 seconds 来加载和连续点击需要时间 milliseconds

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

所以我发现问题出在下面代码中的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 来创建缓存或任何其他替代方法,我可以通过这些替代方法只缓存url 而不是标题

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    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 或缓存在 db 中,它就变得容易了。

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 1970-01-01
      • 2015-06-19
      • 2014-04-11
      • 2020-02-22
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多