【问题标题】:How to prevent the request object from being cached in Django如何防止请求对象在Django中被缓存
【发布时间】:2012-12-10 10:54:05
【问题描述】:

我在我的 django 项目中使用 memcached 进行缓存,我有这样的视图

def questions(request):
    # code to fetch all questions

该函数除了从数据库返回一个问题列表之外什么都不做,但是它呈现结果的页面有一个标题,我在其中显示 request.user 名称。

如果我直接使用@cache_page 装饰器,那么请求对象也会被缓存,并且该页面上的request.user 也会从缓存中获取。结果,当我转到问题页面时,我看到了其他人的名字。

有没有一种方法可以防止请求对象被缓存,使用装饰器。一种方法是使用低级 api 并缓存我想要缓存的查询集,但是是否可以编写一个不会缓存与请求对象相关的任何内容的装饰器?

我希望我的问题很清楚。

【问题讨论】:

    标签: django caching memcached


    【解决方案1】:

    考虑为你的页面修改模板,这样你就可以根据用户缓存一个块

    {% load cache %}
    {% cache 500 sidebar request.user.username %}
        .. sidebar for logged in user ..
    {% endcache %}
    

    其他区块对所有用户都是一样的

    {% cache 500 questions %}
        .. questions list ..
    {% endcache %}
    

    看看Django Template fragment caching docs

    【讨论】:

    • 是的,这是一个可能的解决方案,但这意味着要更改很多模板,以及如果我必须向用户显示问题列表本身所依赖的内容,该怎么办。所以我不能真正缓存它。这就是为什么我通过将请求对象排除在缓存中来寻找更通用的解决方案
    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 2011-05-17
    • 2016-07-16
    • 2013-10-24
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多