首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django缓存REST问题

django缓存REST问题
EN

Stack Overflow用户
提问于 2017-06-05 06:51:50
回答 1查看 682关注 0票数 6

我遵循了堆栈溢出链路中提供的解决方案&当我在浏览器中使用它时,它运行得很好。然而,当我尝试用卷曲点击那个url时,它不为浏览器缓存。

让我解释一下。

如果我从我的铬中点击了一个像example.org/results?limit=7这样的url,它需要8-10 seconds来加载&连续的点击在milliseconds中需要时间

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

因此,我发现问题在于下面代码中的arg参数,因为它包含WSGIRequest对象中的浏览器标头,它用于缓存键,因为它也包含缓存所不需要的标头。这没有达到从celery task自动创建缓存的curl请求的目的。

代码语言:javascript
复制
@method_decorator(cache_page(60 * 60 * 24))
def dispatch(self, *arg, **kwargs):
    print(arg)
    print(kwargs)
    return super(ProfileLikeHistoryApi, self).dispatch(*arg, **kwargs)  

我可以做的是只传递kwargs来创建缓存,或者任何其他只能为urls进行缓存的方法,而不是头。

谢谢你提前帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-08 12:22:32

手动删除方法修饰器和缓存

代码语言:javascript
复制
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装饰器

是的,您是对的,缓存页面修饰器将根据头来决定缓存什么。然而,只有“变化”标题才会产生影响。

其次,只有GET和HEAD请求是缓存的(并且是可缓存的),所以在上面的代码中,我们首先检查方法。

md5

你可能听说过,这是过时和不安全的。对密码学来说也许是这样,但在我们的情况下不适用。这里使用的哈希生成方案与django的钥匙使用的哈希生成方案完全相同,但是我们忽略了方程中的头。

一个人得到的是一个缓慢的一页

每天都会有一个人因为缓存过期而得到一个缓慢的页面。其他人都会得到陈旧的数据。数据只有23小时59分钟。

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

现在,memcached可能有点困难,因为它提供了一种查找具有特定模式的所有键的简单方法,但是如果您使用redis或缓存在db中,则会变得很容易。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44363249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档