2012-09-02 13 views
8

Ho il seguente caso d'uso per il mio web server Tornado:Come condividere i dati tra le richieste in Tornado Web

Su POST richiede iscrizioni possono essere effettuate al server, le voci che non verrà persistito in un file o database . Su richieste GET, un processo può essere avviato o terminato.

Quindi ho bisogno di condividere i dati tra diverse richieste nella mia implementazione RequestHandler. Qual è il modo normale per farlo?

Ho avuto difficoltà nel salvataggio dei dati su self, ad esempio self.entry = "...". In un'altra richiesta i dati non erano più presenti.

L'unica soluzione di lavoro che ho trovato è quello di memorizzare che nell'oggetto applicazione:

application = web.Application([ 
      (r'.*', MainHandler, 
      ]) 

e

def get(self): 
     # ... 
     self.application.entry = "..." 

E 'questo il modo corretto? Inoltre, per quanto riguarda la sincronizzazione, intendo questo significa accesso ai dati condivisi.

risposta

15

suggerisco la seguente: Al posto di un oggetto di accesso al database passare un oggetto che memorizza i dati, per esempio:

data = DataStore() 

application = web.Application([ 
     (r'.*', MainHandler, dict(data = data), 
     ]) 

con il seguente metodo RequestHandler inizializzazione.

def initialize(self, data): 
    self.data = data 

È necessario creare l'oggetto prima e passarlo, altrimenti verrà ricreato ogni volta che viene elaborata una richiesta.

+2

Non ho familiarità con Tornado, ma tieni presente che questo probabilmente non funzionerà se usi più di un processo. – monkut

+0

@monkut Più di un processo per cosa, il server, il client? –

+2

Tornado è un server single-process, a thread singolo ... funzionerà. – oDDsKooL

0

È possibile utilizzare memcached per qualcosa di simile. Tuttavia, dovrai configurare il server memcached.

http://pypi.python.org/pypi/python-memcached/

+2

Non è un po 'eccessivo? Voglio semplicemente memorizzare 2 oggetti per il tempo dell'applicazione in esecuzione. – RevMoon

1

Application è l'oggetto giusto per negozio di (semi) dati persistenti. Tuttavia, come suggerito su altre anwser, dovresti considerare l'utilizzo di un qualche tipo di database per memorizzare questi dati.

Tuttavia, dovresti fare attenzione che quando una sessione (o una transazione) non termina correttamente (ad esempio ottieni un POST ma non ottieni per attivare l'azione), dovresti eliminare i dati della sessione in modo da non avere il tuo memoria perdite del server web.

Dalla mia esperienza, suggerirei di utilizzare Redis poiché è facile da usare e supporta key expiration, un meccanismo che è utile quando è necessario gestire i dati di sessione.

+0

Perché dovrei usare un database per archiviare dati che non voglio persistere?I dati dovrebbero essere disponibili solo al momento del server Web in esecuzione. Se il server Web si arresta in modo anomalo si, i dati dovrebbero essere invalidati. Se il server web deve essere riavviato sì, i dati dovrebbero essere invalidati. – RevMoon

+0

Ti sento. L'applicazione è sicuramente la strada da percorrere in questo caso. È possibile memorizzare i dati della sessione in qualsiasi contenitore che si desidera nell'istanza dell'applicazione. La mia osservazione è stata che quando/se il progetto cresce in funzionalità, la memorizzazione dei dati di sessione in un negozio di terze parti sarà probabilmente sempre più utile. Pensa al monitoraggio delle applicazioni, ad esempio: potrebbe essere bello recuperare/calcolare le metriche sui dati delle sessioni in tempo reale da un negozio (al contrario di quello del server stesso) senza interferire o influire sulle prestazioni del server. – oDDsKooL

6

Il documentation dà un modo per farlo:

class MyHandler(RequestHandler): 
    def initialize(self, database): 
     self.database = database 

    def get(self, username): 
     ... 

mydatabase = dict() 

app = Application([ 
    (r'/user/(.*)', MyHandler, dict(database=mydatabase)), 
    ]) 

quindi è possibile salvare l'oggetto mydatabase in un file.

Ma non sono sicuro che questo sia il modo giusto per ottenere ciò che si desidera per quanto riguarda la sincronizzazione tra le richieste.

+0

Non voglio mantenere i miei dati, voglio solo salvarli durante il runtime. Nessun database richiesto o richiesto qui. – RevMoon

+0

Quello che chiamo 'database' sono solo i tuoi dati, puoi usare qualsiasi tipo di archiviazione dati. Permette di salvarlo durante il runtime. – pintoch

Problemi correlati