我正在运行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)
答案 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}}
干杯。