9

我无法让 memcached 与 GAE 一起工作。当我使用谷歌缓存后端时,按照GAE 网站上的教程,视图没有被缓存。所以我按照 Django 教程中的建议使用缓存 url(例如:

`(r'^example$', cache_page(60*15)(views.example)),

然后我得到这个:

File "/python27_runtime/python27_lib/versions/third_party/django-1.4/django/middleware/cache.py", line 205, in __init__
self.cache_timeout = self.cache.default_timeout

 AttributeError: 'Client' object has no attribute 'default_timeout'

AttributeError:'Client' 对象没有属性'default_timeout',如果我使用谷歌后端(django.core.cache.backends.memcached.MemcachedCache)我得到

Error: ImproperlyConfigured: Error importing middleware django.contrib.sessions.middleware: "No module named memcache".

这里有人之前问过使用 Django 缓存后端并建议安装 python-memcached,我这样做了,但它仍然不起作用。

有人建议为 GAE 编写后端。我不太明白。如果对这个问题的最佳回答是逐步解释如何非常粗略地编写后端,那么我会接受这个答案。

4

2 回答 2

3

并非所有 Django 的功能都适用于 App Engine。因此,由于 App Engine 基础架构的限制,您尝试使用的功能对于 App Engine Django 库是不可接受的。

如果我理解正确,你想缓存整个页面,或者换句话说,整个视图的响应?你可以这样做(只是例子):

# Django on App Engine view example
from google.appengine.api import memcache
from django.http import HttpResponse

def cached_index_page(request):
  output_html = memcache.get('index_page')  # here we "take" from cache
  if output is not None:
    pass
  else:
    output_html = get_page_content()
    memcache.add('index_page', output_html, 60)  # here we "put" to cache" (timeout also here)
  HttpResponse(output_html)

出于您的目的,您可以创建 Django 的中间件,并自动缓存您需要的任何页面。

还要确保您从配置文件中删除了 App Engine 上所有不相关/不可接受的内容。考虑到帮助页面(https://developers.google.com/appengine/articles/django),最小的配置如下:

import os

# 'project' refers to the name of the module created with django-admin.py
ROOT_URLCONF = 'project.urls'

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
#    'django.contrib.sessions.middleware.SessionMiddleware',
#    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware',
    'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware', # NoSQL db middleware
)

INSTALLED_APPS = (
#    'django.contrib.auth',
    'django.contrib.contenttypes',
#    'django.contrib.sessions',
    'django.contrib.sites',
)

ROOT_PATH = os.path.dirname(__file__)
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or
    # "C:/www/django/templates".  Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    ROOT_PATH + '/templates',
)

请记住,App Engine 有自己的本地缓存,例如 Python 运行时环境在单个 Web 服务器上的请求之间缓存导入的模块,您可以告诉 App Engine 缓存 CGI 处理程序脚本本身,以及导入的模块。

有用的链接: https ://developers.google.com/appengine/articles/django-nonrelhttps://developers.google.com/appengine/docs/python/tools/libraries27

于 2013-03-01T23:26:39.383 回答
0

恕我直言,在此添加另一个问题并没有使这变得不那么令人困惑.. Django-nonrel ≤1.3 和 Google App Engine 上的 Memcache可能会回答您的问题。

于 2013-02-14T19:35:01.773 回答