2009-06-08 3 views
9

J'implémente un serveur http avec twisted.web. Voici le problème: il y a une opération de connexion; après cela, je veux que le serveur http se souvienne de chaque client en utilisant acookie/session, jusqu'à ce que l'utilisateur ferme le navigateur.comment utiliser session/cookie dans twisted.web?

J'ai lu le document twisted.web, mais je n'arrive pas à comprendre comment procéder. Je sais que l'objet request a une fonction nommée getSession(), alors un objet session sera retourné. Que faire ensuite? Comment stocker les informations pendant plusieurs demandes? J'ai également recherché la liste de courrier torsadée; il n'y a rien de très utile, et je suis toujours confus. Si quelqu'un l'a déjà utilisé, merci de m'expliquer cela, ou même de mettre du code ici, pour que je puisse le comprendre moi-même. Merci beaucoup!

Répondre

4

Vous pouvez utiliser "request.getSession()" pour obtenir un objet par composants.

Vous pouvez en savoir plus sur les composants dans http://twistedmatrix.com/documents/current/api/twisted.python.components.Componentized.html - la façon la plus simple de l'utiliser est de définir une interface et une implémentation, et d'insérer vos objets dans la session.

+2

http://twistedmatrix.com/documents/current/api/twisted.python.components.Componentized.html est un lien mis à jour –

+0

Merci Peter! J'ai mis à jour le lien. – moshez

4

appel getSession() va générer une session et ajouter le cookie à la demande:

getSession() source code

Si les clients a déjà un cookie de session puis en appelant getSession() va lire et retourner une session avec le contenu de la session d'origine. Il est donc transparent pour votre code s'il crée ou non le cookie de session ou s'il le lit simplement.

Les cookies de session ont certaines propriétés ... si vous voulez plus de contrôle sur le contenu du cookie, regardez Request.addCookie() qui appelle getSession() derrière le scenese.

2

Voir cette question connexe Store an instance of a connection - twisted.web. La réponse il y a des liens vers ce blog http://jcalderone.livejournal.com/53680.html, qui montre un exemple de stocker un compteur pour le nombre de visites pour la session (grâce à jcalderone pour l'exemple):

# 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() 

Ne vous inquiétez pas si cela semble confus - il y a deux choses que vous devez comprendre avant le comportement ici est logique:

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

La valeur du compteur est stockée dans une classe Adapter, la classe Interface documente ce que cette classe fournit. La raison pour laquelle vous pouvez stocker des données persistantes dans l'adaptateur est que Session (retourné par getSession()) est une sous-classe de Componentized.

+0

FYI: L'attribut "value" dans le code ci-dessus peut être n'importe quoi. Ça peut être un dictionnaire entier, si tu veux. Ce n'était pas entièrement évident à partir de la documentation tordue, mais cela fonctionne bien. –

+0

Je veux juste m'en douter quelque part. C'est honnêtement le pire code de stockage de session que j'ai jamais vu de n'importe quel cadre qui fait quelque chose comme ça. Je ne devrais pas avoir à définir 2 classes ou adapter n'importe quoi juste pour stocker une valeur simple dans une session. C'est une API assez mal conçue dans Twisted. –