2012-09-02 12 views
8

tengo el siguiente caso de uso para mi Tornado servidor web:Cómo compartir datos entre las peticiones de Tornado Web

Tras la POST solicita entradas se pueden hacer con el servidor, las entradas que no se persistió en un archivo o base de datos . A partir de las solicitudes GET, se puede iniciar o finalizar un proceso.

Por lo tanto, necesito compartir datos entre diferentes solicitudes en mi implementación RequestHandler. ¿Cuál es la forma normal de hacerlo?

Tuve dificultades para guardar datos en self, por ejemplo self.entry = "...". En otra solicitud, los datos ya no estaban presentes.

La única solución a trabajar que he encontrado es que para almacenar en el objeto de aplicación:

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

y

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

Es que la forma correcta? También sobre sincronización aquí, me refiero a acceso a datos compartidos.

Respuesta

15

que sugieren lo siguiente: En lugar de un objeto de acceso a base de datos de pasar un objeto que almacena sus datos, por ejemplo:

data = DataStore() 

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

con el siguiente método RequestHandler inicialización.

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

Debe crear el objeto antes y pasarlo, de lo contrario se volverá a crear cada vez que se procese una solicitud.

+2

No estoy familiarizado con Tornado, pero tenga en cuenta que esto probablemente no funcionará si utiliza más de un proceso. – monkut

+0

@monkut Más de un proceso para qué, el servidor, el cliente? –

+2

Tornado es un servidor de un solo proceso y un único subproceso ... esto funcionará. – oDDsKooL

1

aplicación es el objeto derecho de almacenar (semi) datos persistentes. Sin embargo, como se sugiere en otro artículo, debería considerar el uso de algún tipo de base de datos para almacenar esta información.

Sin embargo, debe tener en cuenta que si una sesión (o transacción) no finaliza correctamente (por ejemplo, obtiene un POST pero no GET para desencadenar la acción), debe eliminar los datos de la sesión para no tener su memoria de fuga del servidor web.

Desde mi experiencia, sugiero usar Redis ya que es fácil de usar y es compatible con key expiration, un mecanismo que resulta útil cuando se necesita administrar los datos de la sesión.

+0

¿Por qué debería usar una base de datos para almacenar datos que no quiero que persistan?Los datos solo deberían estar disponibles en el momento del servidor web en ejecución. Si el servidor web falla sí, los datos deberían invalidarse. Si el servidor web debe reiniciarse sí, los datos deben invalidarse. – RevMoon

+0

Te escucho. La aplicación es definitivamente el camino a seguir en este caso. Puede almacenar sus datos de sesión en cualquier contenedor que desee en la instancia de la Aplicación. Mi comentario fue solo que cuando su proyecto crezca en funcionalidad, almacenar datos de sesión en una tienda de terceros probablemente sea cada vez más útil. Por ejemplo, piense en el monitoreo de aplicaciones: podría ser grandioso recuperar/calcular métricas en datos de sesiones en vivo de una tienda (a diferencia del servidor en sí) a medida que avanza sin perturbar/afectar el rendimiento de su servidor. – oDDsKooL

6

El documentation da una manera de hacer esto:

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

    def get(self, username): 
     ... 

mydatabase = dict() 

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

continuación, puede guardar el objeto mydatabase en un archivo.

Pero no estoy seguro de que esta sea la manera correcta de lograr lo que desea con respecto a la sincronización entre las solicitudes.

+0

No deseo conservar mis datos, solo quiero guardarlos durante el tiempo de ejecución. No se requiere ni se requiere ninguna base de datos aquí. – RevMoon

+0

Lo que llamo 'base de datos' son solo sus datos, puede usar cualquier tipo de almacenamiento de datos. Permite guardarlo durante el tiempo de ejecución. – pintoch

Cuestiones relacionadas