2013-02-05 9 views
9

Non riesco a rendere memcached il lavoro con GAE. Quando utilizzo il backend della cache di Google, seguendo il tutorial su GAE website, le viste non vengono memorizzate nella cache. Così ho usato la memorizzazione nella cache gli URL come suggerito in Django tutorial (ad es:Come usare la cache con Django? (Preferibilmente in GAE)

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

allora ottengo questo:

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' oggetto non ha attributo 'DEFAULT_TIMEOUT', se io uso google backend (django.core.cache.backends.memcached.MemcachedCache) ottengo

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

Qui qualcuno ha chiesto in precedenza sull'utilizzo di Django caching backend e suggerire di installare python-memcached, ho fatto e ancora non funziona .

Qualcuno ha suggerito di scrivere back-end per GAE. Non riuscivo a capire. Se la migliore risposta a questa domanda spiegherà passo dopo passo come scrivere un backend molto approssimativamente, allora accetterò quella risposta.

+1

Penso che troverete le risposte qui: http://stackoverflow.com/questions/1138715/will-djangos-cache-modules-work-on-google-app -engine – nizz

+0

grazie, bene sono andato a quelle risposte molte volte prima di postare questa domanda sopra. Ma è davvero fonte di confusione poiché le due migliori risposte votate si contraddicono, ed è anche una vecchia discussione. –

risposta

3

Non tutti i lavori funzionali di Django su App Engine. Pertanto, la funzione che stai tentando di utilizzare è inammissibile per la libreria Django di App Engine a causa delle limitazioni dell'infrastruttura di App Engine.

Se ho capito bene, si desidera memorizzare nella cache un'intera pagina o in altre parole la risposta di Vista intera? È possibile farlo in quel modo (solo esempio):

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

per il vostro scopo è possibile creare middleware di Django con il caching automatico qualsiasi pagina, si ha bisogno.

Assicurarsi inoltre di aver rimosso tutto il materiale non correlato/non accettabile da App Engine dal file di configurazione. Considerando pagina di aiuto (https://developers.google.com/appengine/articles/django), la configurazione minima assomiglia:

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

Ricordate, che App Engine ha proprio la cache nativa, ad esempio, L'ambiente runtime di Python memorizza nella cache i moduli importati tra le richieste su un singolo server Web e consente a App Engine di memorizzare nella cache lo script del gestore CGI stesso, oltre ai moduli importati.

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