2013-02-05 11 views
9

Nie mogę tworzyć memcached z GAE. Kiedy używam mechanizmu obsługi pamięci podręcznej Google, korzystając z samouczka na temat GAE website, widoki nie są buforowane. Więc użyłem buforowanie adresy URL, jak zasugerowano w tutorialu Django (npJak używać buforowania z Django? (Najlepiej w GAE)

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

następnie uzyskać to:

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: „Klient” obiekt ma atrybut „default_timeout”, jeśli mogę użyć google backend (django.core.cache.backends.memcached.MemcachedCache) uzyskać

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

Tutaj ktoś zapytał wcześniej o użyciu buforowania Django backend i sugerują, aby zainstalować python-memcached, zrobiłem to i to nadal nie działa .

Ktoś zaproponował napisanie backendu dla GAE. Nie mogłem tego zrozumieć. Jeśli najlepszą odpowiedzią na to pytanie będzie wyjaśnienie krok po kroku, jak napisać bardzo szorstko backend, to zaakceptuję tę odpowiedź.

+1

myślę, że znajdą swoje odpowiedzi tutaj: http://stackoverflow.com/questions/1138715/will-djangos-cache-modules-work-on-google-app -engine – nizz

+0

dziękuję, dobrze poszedłem te odpowiedzi wiele razy przed umieszczeniem tego pytania powyżej. Ale jest to naprawdę mylące, ponieważ dwie najlepsze odpowiedzi są sprzeczne, a także jest to stara dyskusja. –

Odpowiedz

3

Nie wszystkie funkcje działa Django w App Engine. Funkcjonalność, której próbujesz użyć, jest niedopuszczalna w bibliotece App Engine Django z powodu ograniczeń infrastruktury App Engine.

Jeśli dobrze Cię rozumiem, chcesz cacheować całą stronę lub innymi słowy całą odpowiedź widoku? Można to zrobić w ten sposób (tylko przykład):

# 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) 

dla własnych celów można utworzyć Django Middleware z automatycznego buforowania dowolną stronę co potrzeba.

Upewnij się również, że usunięto wszystkie niepowiązane/nieakceptowane w App Engine z plików konfiguracyjnych. Zważywszy strona pomocy (https://developers.google.com/appengine/articles/django), minimalna konfiguracja wygląda następująco:

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', 
) 

Pamiętaj, że App Engine ma własną natywną buforowania, na przykład Środowisko wykonawcze Python buforuje importowane moduły między żądaniami na pojedynczym serwerze WWW, a moduł App Engine może buforować sam skrypt obsługi CGI, a także importowane moduły.

Pomocne linki: https://developers.google.com/appengine/articles/django-nonrelhttps://developers.google.com/appengine/docs/python/tools/libraries27

Powiązane problemy