设置Django以使用Memcached进行缓存(在我的情况下,我想使用会话缓存),在settings.py
我们设置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
我将在App Engine中运行该项目,所以我的问题是我该如何处理LOCATION
条目?
答案 0 :(得分:15)
实际上,过去几天我一直在向GAE移植一个Django(1.6.5)应用程序(GAE Development SDK 1.9.6)。我现在不需要缓存,但如果我需要它,可以很好地了解它。
所以我只是尝试使用django.core.cache.backends.memcached.MemcachedCache
作为我的缓存后端(按照你在问题中描述的那样设置,并将python-memcached放在我的libs文件夹中)和
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
管理我的会话,GAE给了我错误:
RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
...即使你可以使用它,使用Google的API库并借用Django Memcached实现肯定会更好,特别是因为Google lib设计为{{ 3}}以及您的应用随时可以通过SDK更新中断。创建一个python模块,例如my_project/backends.py
:
import pickle
from django.core.cache.backends.memcached import BaseMemcachedCache
class GaeMemcachedCache(BaseMemcachedCache):
"An implementation of a cache binding using google's app engine memcache lib (compatible with python-memcached)"
def __init__(self, server, params):
from google.appengine.api import memcache
super(GaeMemcachedCache, self).__init__(server, params,
library=memcache,
value_not_found_exception=ValueError)
@property
def _cache(self):
if getattr(self, '_client', None) is None:
self._client = self._lib.Client(self._servers, pickleProtocol=pickle.HIGHEST_PROTOCOL)
return self._client
然后您的缓存设置变为:
CACHES = {
'default': {
'BACKEND': 'my_project.backends.GaeMemcachedCache',
}
}
那就是它!这似乎工作正常但我应该清楚它没有经过严格的测试!
在GAE SDK文件夹的google.appengine.api.memcache.__init__.py
中进行搜索,您会发现:
def __init__(self, servers=None, debug=0,
pickleProtocol=cPickle.HIGHEST_PROTOCOL,
pickler=cPickle.Pickler,
unpickler=cPickle.Unpickler,
pload=None,
pid=None,
make_sync_call=None,
_app_id=None):
"""Create a new Client object.
No parameters are required.
Arguments:
servers: Ignored; only for compatibility.
...
即。即使您可以在云中找到memcache实例的LOCATION
,Google自己的库也会忽略它。
答案 1 :(得分:0)
该位置应设置为运行memcache守护程序的ip和port。
在django官方文档中查看此内容。
将LOCATION设置为ip:端口值,其中ip是IP的IP地址 Memcached守护程序和端口是运行Memcached的端口, 或者是unix:path值,其中path是Memcached Unix的路径 套接字文件。
答案 2 :(得分:0)
如果您关注此文档 http://www.allbuttonspressed.com/projects/djangoappengine
克隆这个(如上面链接中所述) https://github.com/django-nonrel/djangoappengine/blob/master/djangoappengine/settings_base.py
我认为您不需要定义位置。如果没有定义它会引发错误吗?