2010-04-07 2 views
1

J'ai une application GAE simple qui comprend un lien de connexion/déconnexion. Cette application est en cours d'exécution sur le serveur de développement pour le moment.Google App Engine: Difficulté avec l'API Users (ou peut-être juste un problème de syntaxe Python)

Le gestionnaire de pages de base obtient l'utilisateur actuel et crée une URL de connexion/déconnexion appropriée. Il place ensuite cette information dans un dictionnaire _template_data, pour la commodité des sous-classes.

class BasePage(webapp.RequestHandler): 
    _user = users.get_current_user() 
    _login_logout_link = None 
    if _user: 
     _login_logout_link = users.create_logout_url('/') 
    else: 
     _login_logout_link = users.create_login_url('/') 

    _template_data = {} 
    _template_data['login_logout_link'] = _login_logout_link 
    _template_data['user'] = _user 

    def render(self, templateName, templateData): 
     path = os.path.join(os.path.dirname(__file__), 'Static/Templates/%s.html' % templateName) 
     self.response.out.write(template.render(path, templateData)) 

Voici une de ces sous-classe:

class MainPage(BasePage): 
    def get(self): 
     self.render('start', self._template_data) 

Le login/lien de fermeture de session est affiché bien, et aller à la page de connexion/déconnexion de devserver correcte. Cependant, cela semble n'avoir aucun effet - le serveur semble toujours penser que l'utilisateur est déconnecté. Qu'est-ce que je fais mal ici?

Répondre

2

Je crois que le problème est l'attribut _user.

Actuellement, l'attribut _user est lié lorsque le module contenant la classe est importé (probablement au démarrage de l'application). Vous devez obtenir l'utilisateur actuel pour chaque demande.

Je récrire en quelque chose comme:.

class BasePage(webapp.RequestHandler): 
    def render(self, template_name, data={}): 
     template_data = {} 
     user = template_data["user"] = users.get_current_user() 
     template_data["login_logout_link"] = users.create_logout_url() if user else users.create_login_url() 
     template_data.update(data) 
     path = os.path.join(os.path.dirname(__file__), 'Static', 'Templates', '%s.html' % template_name) 
     self.response.out.write(template.render(path, template_data) 

Les modèles seraient alors toujours obtenir les valeurs user et login_logout_link envoyés dans Dans une sous-classe, vous pouvez transmettre des valeurs supplémentaires pour le modèle en utilisant l'argument de données (template_data.update(data) met à jour le dictionnaire template_data avec les paires clé/valeur du dictionnaire data).

exemple la sous-catégorie:

class MainPage(BasePage): 
    def get(self): 
     self.render('start', data={"now": datetime.now()}) 
+0

En effet. Cela marche. Merci. –