2016-11-09 5 views
0

Je crée une page Web de base qui a une page d'inscription et une page de connexion. J'utilise google app engine, python et HTML. Ceci est ma fonction utilisateur:Comment créer une fonctionnalité de connexion qui extrait l'utilisateur de la base de données?

class User(db.Model): 
    name = db.StringProperty(required=True) 
    pw_hash = db.StringProperty(required=True) 
    email = db.StringProperty() 

    @classmethod 
    def by_id(cls, uid): 
     return cls.get_by_id(uid, parent=users_key()) 

    @classmethod 
    def by_name(cls, name): 
     u = cls.all().filter('name=', name).get() 
     return u 

    @classmethod 
    def register(cls, name, pw, email=None): 
     pw_hash = make_pw_hash(name, pw) 
     return cls(parent=users_key(), 
        name=name, 
        pw_hash=pw_hash, 
        email=email) 

    @classmethod 
    def login(cls, name, pw): 
     u = cls.by_name(name) 
     if u and valid_pw(name, pw, u.pw_hash): 
      return u 

Lorsque j'inscris de nouveaux utilisateurs, je les mets dans la base de données. Ils sont stockés dans la base de données:

class Register(Signup): 
    def done(self): 
     #make sure the user doesn't already exist 
     u = User.by_name(self.username) 
     if u: 
      msg = 'That user already exists.' 
      self.render('signup-form.html', error_username = msg) 
     else: 
      u = User.register(self.username, self.password, self.email) 
      u.put() 

      self.login(u) 
      self.redirect('/blog') 

Mais quand j'utilise ma fonction de connexion, je ne peux pas récupérer l'utilisateur de la base de données à utiliser la fonction de connexion. Il dit: « connexion invalide » à chaque fois:

class Login(BlogHandler): 
    def get(self): 
     self.render('login-form.html') 

    def post(self): 
     username = self.request.get('username') 
     password = self.request.get('password') 

     u = User.login(username, password) 
     if u: 
      self.login() 
      self.redirect('/blog') 
     else: 
      msg = 'Invalid login' 
      self.render('login-form.html', error = msg) 

Quand j'inscription, il est censé reconnaître que l'utilisateur est déjà dans la base de données. Cependant, je suis capable de m'inscrire avec les mêmes informations à chaque fois. Voici mon inscription Handler:

class Signup(BlogHandler): 
    def get(self): 
     self.render("signup-form.html") 

    def post(self): 
     have_error = False 
     self.username = self.request.get('username') 
     self.password = self.request.get('password') 
     self.verify = self.request.get('verify') 
     self.email = self.request.get('email') 

     params = dict(username = self.username, 
         email = self.email) 

     if not valid_username(self.username): 
      params['error_username'] = "That's not a valid username." 
      have_error = True 

     if not valid_password(self.password): 
      params['error_password'] = "That wasn't a valid password." 
      have_error = True 
     elif self.password != self.verify: 
      params['error_verify'] = "Your passwords didn't match." 
      have_error = True 

     if not valid_email(self.email): 
      params['error_email'] = "That's not a valid email." 
      have_error = True 

     if have_error: 
      self.render('signup-form.html', **params) 
     else: 
      self.done() 

    def done(self, *a, **kw): 
     raise NotImplementedError 

est ici la fonction bloghandler qui est la ligne de base pour toutes les autres fonctions:

class BlogHandler(webapp2.RequestHandler): 
    def write(self, *a, **kw): 
     self.response.out.write(*a, **kw) 

    def render_str(self, template, **params): 
     params['user'] = self.user 
     return render_str(template, **params) 

    def render(self, template, **kw): 
     self.write(self.render_str(template, **kw)) 

    def set_secure_cookie(self, name, val): 
     cookie_val = make_secure_val(val) 
     self.response.headers.add_header(
      'Set-Cookie', 
      '%s=%s; Path=/' % (name, cookie_val)) 

    def read_secure_cookie(self, name): 
     cookie_val = self.request.cookies.get(name) 
     return cookie_val and check_secure_val(cookie_val) 

    def login(self, user): 
     self.set_secure_cookie('user_id', str(user.key().id())) 

    def logout(self): 
     self.response.headers.add_header('Set-Cookie', 'user_id=; Path=/') 

    def initialize(self, *a, **kw): 
     webapp2.RequestHandler.initialize(self, *a, **kw) 
     uid = self.read_secure_cookie('user_id') 
     self.user = uid and User.by_id(int(uid)) 

Voici le lien vers la GitHub:

https://github.com/keldavis/registration

Voici le lien vers le site web:

ation-148718.appspot.com

Comment faire en sorte que ma page d'inscription reconnaisse un utilisateur déjà créé? Et comment puis-je faire en sorte que ma page de connexion récupère mon utilisateur de la base de données et effectue une connexion valide?

Répondre

0

Votre ligne

u = cls.all().filter('name=', name).get()

devrait être soit

u = cls.all().filter('name =', name).get()

ou

u = cls.all().filter('name', name).get()

per Google docs (n ote le caractère espace manquant/le caractère = étant facultatif):

property_operator: chaîne composée d'un nom de propriété et un opérateur de comparaison en option (=, =, <, < =,>,> = , IN), séparés par un espace: par exemple, 'age>'. Si seul un nom de propriété est spécifié sans opérateur de comparaison , le filtre compare l'égalité (=) par défaut.

(Notez également que vous devez utiliser google.appengine.ext.ndb au lieu de google.appengine.ext.db et ne devrait vraiment pas être implémentez l'authentification/autorisation/hash/etc sur votre propre dans les applications réelles)