在App Engine上为Django会话缓存设置Memcached

pbh*_*ick 4 python django google-app-engine memcached caching

设置Django以使用Memcached进行缓存(在我的情况下,我想使用会话缓存),在settings.py我们设置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}
Run Code Online (Sandbox Code Playgroud)

我将在App Engine中运行该项目,所以我的问题是我该怎么做才能LOCATION进入?

Ste*_*ven 16

碰巧的是,我在过去的几天里一直在向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' 
Run Code Online (Sandbox Code Playgroud)

管理我的会话和GAE给了我错误:

RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
Run Code Online (Sandbox Code Playgroud)

无论如何...

...即使你可以让它工作,使用谷歌的API库并借用Django Memcached实现肯定会更好,特别是因为谷歌lib被设计为与python-memcached兼容,否则你的应用程序可能会破坏任何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
Run Code Online (Sandbox Code Playgroud)

然后您的缓存设置变为:

CACHES = {
    'default': {
        'BACKEND': 'my_project.backends.GaeMemcachedCache',
    }
}
Run Code Online (Sandbox Code Playgroud)

而已!这似乎工作正常,但我应该清楚,它没有经过严格的测试!

在旁边

各地都捅在google.appengine.api.memcache.__init__.py你的GAE SDK文件夹,你会发现:

  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.
    ...
Run Code Online (Sandbox Code Playgroud)

即使你可以LOCATION在云中找到一个for memcache实例,谷歌自己的库也会忽略它.