1

我在 django 前面运行 memcached,而我的代码中没有任何显式配置。即无非

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

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

在我的settings.py. 这很好用,事实上它非常好,它正在缓存我的管理页面,让我无法在缓存重新获取数据之前调节网站上的实时操作。是否有一个正则表达式我可以放在某个地方让 memcached 知道不要管我的管理页面?(我也在使用 nginx 和 gunicorn)

4

2 回答 2

0

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

在设置文件中指定一个 url 字典:

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有一个关于 django、memcached 和 Nginx 的非常简洁的教程,也许你想通读一遍以获得更好的想法。

于 2012-12-13T07:01:07.110 回答
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',
)

干杯。

于 2015-03-20T03:09:18.927 回答