我试图在我的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的新手,确信我错过了一些东西.任何的想法?
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', # ... )
如果您没有它们,那么每次使用每站点缓存功能时,您将收到错误的标头错误.