Django-cms页面可以包含vary_on_headers装饰器吗?

时间:2013-10-07 19:11:59

标签: django caching django-cms

我正在使用Django-CMS构建网站,我们正在使用MobileESP来检测用户代理,并根据查看网站所使用的设备提供不同的模板和内容。

问题在于,使用django-cms的内置页面缓存,用户会看到错误的内容,具体取决于缓存的页面版本。例如,如果首先查看网站的桌面版本然后进行缓存,则在智能手机上访问该网站的用户仍会看到桌面版本而不是移动版本。

使用传统的Django视图,可以使用@vary_on_headers('User-Agent')解决这个问题,以确保不同版本的网站得到正确缓存。

是否可以将此逻辑应用于Django-CMS视图中的一些方法?

2 个答案:

答案 0 :(得分:1)

我设法通过在自定义中间件类中使用patch_vary_headers()功能找到解决此问题的方法。我已经有了一个平台检测中间件,它将移动/桌面设置添加到请求对象中。所以我只是在中间件中添加了一个process_response函数并在那里修补了它。到目前为止它似乎正常工作。

class PlatformDetectionMiddleWare (object):

    def process_request(self, request):
        user_agent = request.META.get("HTTP_USER_AGENT")
        http_accept = request.META.get("HTTP_ACCEPT")

        agent = mdetect.UAgentInfo(userAgent=user_agent, httpAccept=http_accept)
        request.is_tablet = agent.detectTierTablet()
        request.is_mobile = agent.detectTierIphone()

    def process_response(self, request, response):
        patch_vary_headers(response, ['User-Agent'])
        return response

答案 1 :(得分:0)

http://www.djangobook.com/en/2.0/chapter15.html我认为你可以像SI Eric建议的那样进行缓存,这个链接谈论有关vary_header的缓存我认为它可以帮助解决你的问题。 我使用

缓存视图层
@vary_on_headers('User-Agent')

在我的项目中运行良好!