2014-07-15 14 views
6

Ho un django 1.5 in esecuzione su Google App Engine utilizzando il modulo djangoappengine per il punto. Tutto funziona bene, tranne che circa la metà delle chiamate/_ah/coda/differite alzare il seguente errore di importazione:/_ah/queue/differito sconosciuto errore di importazione

Traceback (most recent call last): 
    File "..../third_party/djangoappengine/deferred/handler.py", line 2, in <module> 
    from djangoappengine import main 
ImportError: No module named djangoappengine 

Come si può vedere, il modulo djangoappengine si trova all'interno della directory third_party, e questa directory viene aggiunto al sys.path nel file appengine_config.py, quindi non ci dovrebbero essere problemi a fare from djangoappengine import main:

sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'third_party')) 

la relativa riga in app.yaml è:

handlers: 
- url: /_ah/queue/deferred 
    script: third_party/djangoappengine/deferred/handler.py 
    login: admin 

Che cosa sta causando questi sporadici errori di importazione? Sto facendo qualcosa di sbagliato? Forse c'è un ciclo di importazione di cui non sono a conoscenza?

+0

funziona affatto se si rimuove "THIRD_PARTY /" dal percorso dello script in app.yaml? –

risposta

2

Ho scoperto che il mio codice utilizzava la vecchia interfaccia CGI al posto del più recente WSGI. Ho risolto questo problema e il problema non è tornato da allora.

Aggiornato app.yaml:

handlers: 
- url: /_ah/queue/deferred 
    script: djangoappengine.deferred.handler.application 
    login: admin 
+0

ciao, sto usando lo stesso gestore come fai tu e vedo ancora che un certo numero di attività non riesce a caricare tutto l'ambiente Django (nel mio esempio non vede l'env CACHES). Qualcos'altro che hai fatto qui? – manubot

1

La libreria di deffer è nota per fare cose strane con le importazioni di terze parti. Ha qualcosa a che fare se l'attività posticipata carica una nuova istanza. Le librerie di terze parti sono lente per essere caricate. Hai 2 opzioni (con un 3 non sono sicuro funzionerà)

  • Utilizzare la chiamata di tipo task standard. Posso aiutarti a riscriverti se necessario.
  • Se hai solo bisogno di django e non della speciale libreria di djangoappengine dovresti usare il motore dell'app. Sono garanzia di essere caricati.
  • Non so se questo funzionerà, ma potrebbe valere la pena provare a mettere l'importazione in un ciclo di prova eccetto fino a quando non viene caricato. È solo un'idea che non ho mai provato a farlo io stesso
Problemi correlati