如何将never_cache应用到第三方Django应用的URL?

1 投票
2 回答
892 浏览
提问于 2025-04-18 15:28

我正在尝试在 urls.py 文件中使用 @never_cache 这个装饰器。我觉得可以这样使用:

url(r'^about/', never_cache(TemplateView.as_view(template_name="about_us.html"))),

但很多时候我在使用外部应用程序,通常我只需要写 url('', include(shop.urls))。比如说 django-oscar 这个库。那么在这种情况下,我该怎么把 never_cache 应用到它上面呢?

2 个回答

0

以下内容在Django 1.11中对我有效(继续使用shop.urls的例子):

uncached_patterns = [
    url(urlpattern.regex.pattern, never_cache(urlpattern.callback), name=urlpattern.name) for urlpattern in shop.urls.urlpatterns
]

urlpatterns += [
    url('', include(uncached_patterns))
]
1

你可以试试这个来自 django-snippets 的方法:

from django.conf.urls.defaults import url
from django.views.decorators.cache import never_cache

def never_cache_patterns(prefix, *args):
    pattern_list = [], tterns,
    for t in args:
        if isinstance(t, (list, tuple)): 
            t = url(prefix=prefix, *t)
        elif isinstance(t, RegexURLPattern):
            t.add_prefix(prefix)

        t._callback = never_cache(t.callback)
        pattern_list.append(t)

    return pattern_list


urlpatterns = never_cache_patterns('',
    (r'foo/$', 'myview')
)

看起来没有更简单的方法来实现这个功能。

如果你想把它应用到另一个你无法编辑的应用中的一组网址,你可以试试:

uncached_patterns = never_cache_patterns('',
   url(r'^$', include('shop.urls')),
   )

urlpatterns = patterns('',
    include(uncached_patterns),
    # other patterns
    # eg. url(r'^myapp/', include('myapp.urls', namespace="myapp")),
    # ...
)

撰写回答