2013-10-04 5 views
1

Je me bats pour obtenir des sessions cherrypy pour faire ce que je voudrais. J'ai une application qui s'engage dans des conversations individuelles avec l'utilisateur (chaque dialogue a un dlg_nbr unique). Cela semble fonctionner (voir les deux premiers cycles de la sortie du journal ci-dessous) jusqu'à ce que les dialogues séparés soient mélangés (lorsque je publie simultanément), et user1 commence à obtenir les réponses destinées à user2 (troisième cycle dans la sortie du journal). traité.Comment garder les sessions cherrypy distinctes les unes des autres

J'aurais pensé que si ma fonction principale (think()) utilise et renvoie un dlg_nbr, unique pour chaque utilisateur, que je stocke en tant que session [dlg_nbr], cela assurerait la continuité entre les cycles de réponse/requête. est unique pour chaque utilisateur, non? Je comprends que le multi-threading de Cherrypy peut signifier que les choses se déroulent en parallèle, mais les sessions ne doivent sûrement pas se mélanger. Cela me rend fou, est-ce une caractéristique de cherrypy, qu'est-ce que je fais mal?

Code cherrypy

class Web: 

    def rsp(self, stm=''): 

     print ' 10 SESSION ID ON REQUEST', cherrypy.session.id 
     dlg_nbr = cherrypy.session.get('dlg_nbr') 

     # main logic of app 
     rsp, dlg_nbr = B.think(stm, dlg_nbr) 

     print ' 20 SESSION ID AFTER PROCESSING REQUEST', cherrypy.session.id 
     cherrypy.session['dlg_nbr'] = dlg_nbr 

    return rsp 

if __name__ == '__main__': 
    cherrypy.config.update(
     {'server.socket_host': config.HOST, 
     'server.socket_port': config.PORT}) 

    STATIC_DIR = os.path.join(os.path.abspath("."), u"static") 
    dev_config = { 
     '/': {'tools.caching.on': False, 'tools.sessions.on': True}, 
     '/static': {'tools.staticdir.on': True, 
     'tools.staticdir.dir': STATIC_DIR}} 

    cherrypy.quickstart(Web(), config=dev_config) 

ajax message:

$.ajax({ 
      url: '/rsp', 
      data: {stm: input_string}, 
      type: "POST", 
      timeout: 10000, 
      success: function(response) {......} 

sortie du journal:

# Expected result for remote user 
192.168.1.2 - - [04/Oct/2013:23:22:05] "POST /rsp HTTP/1.1" 200 65 "http://192.168.1.4:8003/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36" 
    10 SESSION ID ON REQUEST 6125bf1b113e2da09e4653e8eccf0bd3b7240ddb 
    20 SESSION ID AFTER PROCESSING REQUEST 6125bf1b113e2da09e4653e8eccf0bd3b7240ddb 

# Expected result for localhost 
127.0.0.1 - - [04/Oct/2013:23:22:09] "POST /rsp HTTP/1.1" 200 8 "http://localhost:8003/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/28.0.1500.71 Chrome/28.0.1500.71 Safari/537.36" 
    10 SESSION ID ON REQUEST d09998f541d6a19742b8d73314a1dba6bba42a84 
    20 SESSION ID AFTER PROCESSING REQUEST d09998f541d6a19742b8d73314a1dba6bba42a84 

# Local host seems to get result of post made by remote user (when submitting stm at the same time) 
192.168.1.2 - - [04/Oct/2013:23:22:14] "POST /rsp HTTP/1.1" 200 33 "http://192.168.1.4:8003/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36" 
    10 SESSION ID ON REQUEST 6125bf1b113e2da09e4653e8eccf0bd3b7240ddb 
    10 SESSION ID ON REQUEST d09998f541d6a19742b8d73314a1dba6bba42a84 
    20 SESSION ID AFTER PROCESSING REQUEST 6125bf1b113e2da09e4653e8eccf0bd3b7240ddb 

# finally remote user gets expected result, (but seems out of synch) 
127.0.0.1 - - [04/Oct/2013:23:22:19] "POST /rsp HTTP/1.1" 200 17 "http://localhost:8003/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/28.0.1500.71 Chrome/28.0.1500.71 Safari/537.36" 
    20 SESSION ID AFTER PROCESSING REQUEST d09998f541d6a19742b8d73314a1dba6bba42a84 

Répondre

1

Je fixe d ceci maintenant. J'attribuais des valeurs à une variable globale temporaire pour plus de commodité. Il semble que ceux-ci sont partagés à travers les multiples threads de Cherrypy. La solution était de ne pas utiliser de globales mais de déclarer explicitement les variables dans la portée locale. Fonctionne maintenant bien

Questions connexes