Django - 多站点站点缓存

Wer*_*rda 6 django django-sites django-caching

我在一个Django应用程序下有许多站点,我想实现站点范围的缓存.然而事实证明这是一个真正的麻烦.

发生的事情是settings.CACHE_MIDDLEWARE_KEY_PREFIX在启动时设置一次,我无法继续并根据当前站点的内容进行更改.因此,如果http://website1.com/abc/缓存了一个url页面,则http://website2.com/abc/呈现缓存版本http://website1.com/abc/.这两个网站都在同一个Django实例上运行,因为Django Sites似乎允许我们这样做.

这是一种不正确的方法吗?因为我无法CACHE_MIDDLEWARE_KEY_PREFIX在运行时动态设置,所以无法使用Django的站点范围缓存来缓存多个站点.我也无法为模板和视图缓存执行此操作.

我得到的印象是,真正需要设置的方式是每个站点都需要自己的Django实例,除了设置文件之外几乎完全相同,在我的情况下,设置文件只有不同的值CACHE_MIDDLEWARE_KEY_PREFIX.这些Django实例都读写同一个数据库.这让我很担心,因为它可能会产生一些新问题.

我是走在正确的轨道上还是我错误地认为多站点架构需要如何工作?我检查了Django文档,并没有真正提到如何处理为多个站点提供服务的Django应用程序的缓存(不是低级缓存).

Sha*_*hin 3

(免责声明:以下内容纯属猜测,未经测试。食用时请加少许盐。)

可以使用Variety_on_headers视图装饰器将“Host”标头包含在缓存键中。这应该会导致缓存键包含 HTTP 主机标头,从而有效地隔离站点的缓存。

@vary_on_headers('Host')
def my_view(request):
    # ....
Run Code Online (Sandbox Code Playgroud)

当然,这只适用于每个视图,并且必须向所有视图添加装饰器可能会很麻烦。

深入研究@vary_on_headers 的源代码揭示了patch_vary_headers()的使用,人们可以在中间件中使用它来在站点级别应用相同的行为。大致如下:

from django.utils.cache import patch_vary_headers

class VaryByHostMiddleware(object):
    def process_response(self, request, response):
        patch_vary_headers(response, ('Host',))
        return response
Run Code Online (Sandbox Code Playgroud)