2010-10-06 16 views
1

Je suis un programmeur php qui commence juste avec Python. J'essaye de faire en sorte que Python gère la connexion/déconnexion via des sessions stockées dans une base de données. Les choses fonctionnent, mais semblent incompatibles. Par exemple, un utilisateur n'est parfois pas déconnecté. Parfois, les utilisateurs "commutent" les connexions. Je suppose que cela a quelque chose à voir avec la sécurité des threads, mais je ne sais pas par où commencer pour résoudre ce problème. Toute aide serait appréciée. Voici ce que j'ai maintenant:Un bon moyen de faire la gestion de session en Python + Pylons pour un programmeur php

#lib/base.py 

def authenticate(): 
#Confirm login 
try: 
    if user['authenticated'] != True: 
     redirect_to(controller='login', action='index') 
except KeyError: 
    redirect_to(controller='login', action='index') 

#Global variables 
user = {} 
connection = {} 

class BaseController(WSGIController): 

#Read if there is a cookie set 
    try: 
     session = request.cookies['session'] 

     #Create a session object from the session id 
     session_logged_in = Session(session) 

     #If the session is valid, retrieve the user info 
     if session_logged_in.isValid(remote_addr): 

      #Set global variables about the logged in user 
      user_logged_in = User(session_logged_in.user_id) 
      user['name'] = c.name = user_logged_in.name 
      user['name_url'] = c.name_url = user_logged_in.name_url 
      user['first_name'] = c.first_name = user_logged_in.first_name 
      user['last_name'] = c.last_name = user_logged_in.last_name 
      user['email'] = c.email = user_logged_in.email 
      user['about'] = c.about = user_logged_in.about 
      user['authenticated'] = c.authenticated = True 
      user['profile_url'] = c.profile_url = user_logged_in.profile_url 
      user['user_thumb'] = c.user_thumb = user_logged_in.user_thumb 
      user['image_id'] = c.image_id = user_logged_in.image_id 
      user['id'] = c.user_id = user_logged_in.id 

      #Update the session 
      session_logged_in.current_uri = requested_url 
      session_logged_in.update() 

    #If no session has been set, do nothing 
    except KeyError: 
     user['authenticated'] = False 

Je peux alors accéder à l'utilisateur {} global de mes contrôleurs:

#controllers/profile.py 
from project.lib.base import BaseController, user 
class ProfileController(BaseController): 

    def index(self, id=None, name_url=None): 

     #If this is you 
     if user['id'] == 1 
      print 'this is you' 

Y at-il une meilleure façon de le faire? Merci de votre aide.

+1

Je n'ai pas encore travaillé avec les sessions Pylons, donc je ne suis d'aucune aide. Mais puisque vous commencez avec Python, je pourrais suggérer de refactoriser votre fonction d'authentification comme ceci: sinon user.get ('authentication', False): redirect (blah blah), de cette façon, vous n'avez pas besoin d'attraper KeyError des exceptions. –

+0

Merci. Je vais mettre en œuvre cela maintenant. – ensnare

Répondre

3

Pylons a un objet 'sessions' qui existe pour gérer ce genre de situation. Le example sur le site Web Pylons semble correspondre à ce que vous voulez.

Je pense que vous rencontrez des problèmes à cause de l''utilisateur' et de la 'connexion' globaux. Pylons a un objet globals conçu pour partager des informations entre tous les contrôleurs et n'est pas réinitialisé à chaque requête.