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

时间:2014-07-11 14:19:08

标签: python django google-app-engine caching memcached

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

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

我将在App Engine中运行该项目,所以我的问题是我该如何处理LOCATION条目?

3 个答案:

答案 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的路径   套接字文件。

https://docs.djangoproject.com/en/dev/topics/cache/

答案 2 :(得分:0)

如果您关注此文档 http://www.allbuttonspressed.com/projects/djangoappengine

克隆这个(如上面链接中所述) https://github.com/django-nonrel/djangoappengine/blob/master/djangoappengine/settings_base.py

我认为您不需要定义位置。如果没有定义它会引发错误吗?