2009-06-08 11 views
9

Estoy implementando un servidor http con twisted.web. Aquí viene el problema: hay una operación de inicio de sesión; después de eso, quiero que el servidor http recuerde a cada cliente utilizando la sesión/acookie, hasta que el usuario cierre el navegador.cómo usar session/cookie en twisted.web?

He leído el documento twisted.web, pero no puedo encontrar la manera de hacerlo. Sé que el objeto de solicitud tiene una función llamada getSession(), luego se devolverá un objeto de sesión. ¿Qué sigue? ¿Cómo almaceno la información durante las varias solicitudes?

También busqué en la lista de correo retorcido; no hay nada muy útil, y todavía estoy confundido. Si alguien usó esto antes, por favor explícame esto, o incluso pon un código aquí, para que yo pueda entenderlo. ¡Muchas gracias!

Respuesta

4

Puede usar "request.getSession()" para obtener un objeto componentizado.

Puede leer más acerca de componentized en http://twistedmatrix.com/documents/current/api/twisted.python.components.Componentized.html - la forma básica de usarlo es mediante la definición de una interfaz y una implementación, y empujando sus objetos en la sesión.

+2

http://twistedmatrix.com/documents/current/api/twisted.python.components.Componentized.html es un enlace actualizado –

+0

Gracias Peter! Actualicé el enlace. – moshez

4

Calling getSession() generará una sesión y añadir la cookie a la solicitud:

getSession() source code

Si los clientes que ya tiene una cookie de sesión a continuación, llamar getSession() lo leerá y devolver una sesión con el contenido original de la sesión Por lo tanto, es transparente para su código si realmente está creando la cookie de sesión o simplemente leyéndola.

Las cookies de sesión tienen ciertas propiedades ... si desea tener más control sobre el contenido de la cookie, mire en Request.addCookie() las llamadas getSession() detrás de scenese.

2

Ver esta pregunta relacionada Store an instance of a connection - twisted.web. La respuesta hay enlaces a esta entrada del blog http://jcalderone.livejournal.com/53680.html, que muestra un ejemplo de almacenamiento de un contador del número de visitas de la sesión (gracias a jcalderone para el ejemplo):

# in a .rpy file launched with `twistd -n web --path .` 
cache() 

from zope.interface import Interface, Attribute, implements 
from twisted.python.components import registerAdapter 
from twisted.web.server import Session 
from twisted.web.resource import Resource 

class ICounter(Interface): 
    value = Attribute("An int value which counts up once per page view.") 

class Counter(object): 
    implements(ICounter) 
    def __init__(self, session): 
     self.value = 0 

registerAdapter(Counter, Session, ICounter) 

class CounterResource(Resource): 
    def render_GET(self, request): 
     session = request.getSession() 
     counter = ICounter(session) 
     counter.value += 1 
     return "Visit #%d for you!" % (counter.value,) 

resource = CounterResource() 

No se preocupe si esto parece confuso - hay dos cosas que usted necesita entender antes de la conducta que aquí tiene sentido:

  1. Twisted (Zope) Interfaces & Adapters
  2. Componentized

El valor del contador se almacena en una clase de adaptador, la clase de interfaz documenta lo que proporciona esa clase. La razón por la que puede almacenar datos persistentes en el Adaptador es porque Session (devuelta por getSession()) es una subclase de Componentized.

+0

FYI: El atributo "valor" en el código anterior puede ser cualquier cosa. Puede ser un diccionario completo, si lo desea. Eso no era completamente obvio a partir de la documentación retorcida, pero funciona bien. –

+0

Solo quiero despotricar sobre esto en alguna parte. Este es honestamente el peor código de almacenamiento de sesión que he visto desde cualquier marco que hace algo así. No debería tener que definir 2 clases ni adaptar nada solo para almacenar un valor simple en una sesión. Esta es una API muy irritantemente mal diseñada en Twisted. –