如何告诉memcached忽略django管理页面?

时间:2012-12-13 05:47:06

标签: django nginx memcached gunicorn

我正在运行django的memcached infront而我的代码中没有任何显式配置。即

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    ...
    'django.middleware.cache.FetchFromCacheMiddleware',
    )

CACHE_BACKEND = 'memcached://127.0.0.1:11211/'

在我的settings.py中。这很好用,实际上非常好,以至于它缓存了我的管理页面,让我无法在网站上缓解实际操作,直到缓存重新获取数据。有没有一个正则表达式我可以扔到某个地方让memcached知道单独留下我的管理页面? (我也在使用nginx和gunicorn)

2 个答案:

答案 0 :(得分:0)

您可以编写自己的中间件类或从django提供的类扩展。

在设置文件中指定网址字典:

CACHE_IGNORE_REGEXPS = (
)

编写中间件类:

from django.core.cache import cache
import re
import settings


class MyMemCacheMiddleWare:
    def process_response(self, request, response):
        cacheIt = True
        theUrl = request.get_full_path()

        # if it's a GET then store it in the cache:
        if request.method != 'GET':
            cacheIt = False

        # loop on our CACHE_INGORE_REGEXPS and ignore
        # certain urls.
        for exp in settings.CACHE_IGNORE_REGEXPS:
            if re.match(exp,theUrl):
                cacheIt = False

        if cacheIt:
            key = '%s-%s' % (settings.CACHE_KEY_PREFIX,theUrl)
            cache.set(key,response.content)     

        return response

Alex Holt有一个非常整洁的tutorial关于django,memcached和Nginx也许你想通读它以获得一个更好的主意。

答案 1 :(得分:0)

我遇到了同样的问题,我想出了另一个最小的解决方案。

首先,创建自己的继承原始UpdateCacheMiddleware

的中间件
#! /usr/bin/env python
from django.conf import settings
from django.middleware.cache import UpdateCacheMiddleware


class MyUpdateCacheMiddleware(UpdateCacheMiddleware):
    def process_response(self, request, response):
        full_path = request.get_full_path()
        # loop on our CACHE_MIDDLEWARE_IGNORE to ignore certain urls
        for ignore in settings.CACHE_MIDDLEWARE_IGNORE:
            if ignore.match(full_path):
                return response
        # ignore patterns missed, pass it to the original middleware
        return super(MyUpdateCacheMiddleware, self).process_response(
            request, response
        )

然后在您的设置中创建一个忽略正则表达式列表:

CACHE_MIDDLEWARE_IGNORE = (
    re.compile(r'^/admin/'),
)

现在您需要做的就是将UpdateCacheMiddleware替换为您创建的MIDDLEWARE_CLASSES = ( 'myapp.lib.middlewares.MyUpdateCacheMiddleware', # ... 'django.middleware.cache.FetchFromCacheMiddleware', )

{{1}}

干杯。