2012-08-14 11 views
5

Sto implementando un progetto Web davvero leggero, che ha una sola pagina, che mostra i dati in un diagramma. Io uso Django come webserver e d3.js come tracciare la routine per questo diagramma. Come puoi immaginare, ci sono solo poche serie temporali che devono essere soddisfatte dal server Django, quindi mi chiedevo se potevo semplicemente tenere questa variabile in ram. Il mio primo test è stato positivo, ho avuto qualcosa di simile nella mia views.py:django vars in ram

X = np.array([123,23,1,32,123,1]) 

@csrf_exempt 
def getGraph(request): 
    global X 
    return HttpResponse(json.dumps(X)) 

Avviso, X viene aggiornata da un'altra funzione di tanto in tanto, ma tutti gli accessi utente è in sola lettura. Devo occuparmi di

  1. problemi di sicurezza definendo una variabile globale?
  2. incoerenze in generale?

Ho trovato a thread discutendo le variabili globali in Django, ma in tal caso, la difficoltà è di gestire più accessi in scrittura.

Per rispondere a potenziali domande sul motivo per cui non desidero memorizzare i dati nel database: Tutti i dati che ho ottenuto nel mio X sono già memorizzati in un enorme database remoto e questa app Web ha solo bisogno di visualizzare i dati.

risposta

2

La sua memorizzazione in una variabile ha effettivamente implicazioni di threading (e anche scalabilità - cosa succede se due server Django eseguono la stessa app?). Il consiglio della comunità Django è non!.

Questo suona come una buona misura per il sistema di cache Django però. Basta memorizzare la tua vista getGraph con @cache_page e il lavoro è finito. Non è necessario utilizzare memcache, la memoria cache in-memory integrata-backend * funzionerà correttamente. Metti un numero molto alto come il timeout sulla cache (anni).

In questo modo si memorizza la risposta HTTP (JSON) non il valore di X. Ma dal proprio esempio di codice, non si tratta di un problema. Se è necessario ricalcolare X è necessario ricalcolare il JSON, e se avete bisogno di ri-calcolare il JSON è necessario ricalcolare X.

https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs/


o semplicemente "backend memoria incorporata", non ho resistito

+0

Come membro della comunità Django, non direi necessariamente "non farlo" - ho fatto alcune cose molto simili io stesso. Ma +1 per il backend della cache, è un modo molto migliore per risolvere questo problema. –

+1

@Joe Ho provato questo, e funziona bene con le normali richieste http, ma quando lo chiamo tramite 'AJAX' non è memorizzato nella cache. Immagino che Django consideri ogni singola richiesta "AJAX" diversa da quella precedente e calcola nuovamente "X". Come affrontarlo? Ma grazie, ancora una volta per raccomandare il sistema di cache Django - sembra essere molto più elegante delle vars globali –

+1

non importa! L'ho risolto usando "L'API cache di basso livello". È semplicemente perfetto molte grazie –