当前位置:  开发笔记 > 编程语言 > 正文

如何在django中缓存查询结果?

如何解决《如何在django中缓存查询结果?》经验,为你挑选了1个好方法。

我试图在我的django应用程序上缓存查询结果.但是,似乎它正在缓存整个应用程序.我试过跟随logi:

def cacheView():
  result = cache.get('key')
  if result is None:
    result = Model.objects.get(id=1)
    cache.set('key', 'result')

我在用户登录时调用此方法.但是,如果我在登录后尝试注销,它会让我保持在同一页面,就像我仍然登录一样.我试图在http:// docs上关注缓存上的Django 文档. djangoproject.com/en/1.2/topics/cache/但没有成功.

我尝试的另一件事是,如果我尝试在视图上方使用缓存装饰器:

@cache_control(max_age=1000)
def cacheView():
 ...

它会给出一个错误,说"响应标头未定义".我是django的新手,确信我错过了一些东西.任何的想法?



1> bx2..:

RTFM :)官方Django文档:缓存和查询集

每个QuerySet都包含一个缓存,以最小化数据库访问.(......)

和:

在新创建的QuerySet中,缓存为空.第一次评估QuerySet - 并因此发生数据库查询 - Django将查询结果保存在QuerySet的缓存中并返回已明确请求的结果(例如,如果正在迭代QuerySet,则返回下一个元素)过度).QuerySet的后续评估重用缓存的结果.

在QuerySets(查询结果)的情况下,缓存是自动完成的.

编辑: 至于您在问题中粘贴的代码.如果密钥尚未存在于缓存中,则必须使用add()方法创建密钥,但请记住它将在30秒后默认过期.如果希望它保持更长时间,则必须为add()/set()方法添加超时选项.

如果你想缓存整个你的站点(就像你使用它们那样的装饰器),你需要MIDDLEWARE_CLASSES在settings.py中添加适当的中间件(按照这个确切的顺序,因为中间件顺序很重要,它是逐个加载的你定义它们):

MIDDLEWARE_CLASSES = (
    # ...
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
    # ...
)

如果您没有它们,那么每次使用每站点缓存功能时,您将收到错误的标头错误.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有