如何在Django中选择性地缓存视图

时间:2016-06-27 01:32:22

标签: django caching django-views django-cache

我在我的Django应用程序中创建了一个需要加载身份验证的视图。如果凭据不正确,则会发回错误403页面。因为我声明视图要缓存在urls.py文件中,就像这样......

    url(r'^example/example-url/(?P<special_id>\d+)/$',
        cache_page(60 * 60 * 24 * 29, cache='site_cache')(views.example_view),
        name="example"),

...然后甚至错误页面都被缓存了。由于缓存是29天,我无法做到这一点。此外,如果页面成功缓存,它会跳过我在视图中执行的身份验证步骤,从而使数据容易受到攻击。 我只希望django在结果成功时缓存页面,而不是在抛出错误时。此外,缓存页面应仅在视图中进行身份验证后显示。我怎么能这样做?

setting.py中的我的缓存设置:

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    'LOCATION': 'unique-snowflake',
},
'site_cache': {
    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
    'LOCATION': '/var/tmp/django_cache',
}

}

提前致谢

1 个答案:

答案 0 :(得分:2)

简单的解决方法。像这样更改urls.py

url(r'^example/example-url/(?P<special_id>\d+)/$',
        views.example_view,
        name="example"),

然后像这样修改你的example_view:

def example_view(request, sepcial_id):
    if request.user.is_authenticated():
        key = 'exmpv{0}'.format(special_id)

        resp = cache.get(key)
        if not resp:
             # your complicated queries

             resp = render('yourtemplate',your context)
             cache.set(key, resp)
        return resp
     else:
         # handle unauthorized situations

我是否也有兴趣转换到memcached而不是基于文件的缓存?