如何创建从数据库中检索用户的登录功能?

时间:2016-11-09 05:24:21

标签: html5 python-2.7 google-app-engine backend gqlquery

我正在制作一个包含注册页面和登录页面的基本网页。我正在使用谷歌应用程序引擎,python和HTML。这是我的用户功能:

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')

当我注册新用户时,我将它们放在数据库中。它们存储在数据库中:

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)

但是当我使用登录功能时,我无法从数据库中检索用户以使用登录功能。它每次都说“登录无效”:

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

当我注册时,它应该认识到用户已经在数据库中。但是,我每次都可以使用相同的凭据进行注册。这是我的注册处理程序:

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

这是bloghandler函数,它是所有其他函数的基线:

<html>
    <form method='GET' action='your action here'>

        /*
        * all other html here
        */

        <input type='submit' value='Submit' id='btnSubmit' name='btnSubmit'>

    </form>

</html>

$submitButton = $crawler->selectButton('btnSubmit');

以下是GITHUB的链接:

https://github.com/keldavis/registration

以下是该网站的链接:

registration-148718.appspot.com

如何让我的注册页面识别已创建的用户?如何让我的登录页面从数据库中检索我的用户并执行有效的登录?

1 个答案:

答案 0 :(得分:0)

你的行

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

应该是

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

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

per Google docs(请注意缺少的空格字符/ =字符是可选的):

  

property_operator :由属性名称和可选比较组成的字符串   operator(=,!=,&lt;,&lt; =,&gt;,&gt; =,IN),用空格分隔:例如,   '年龄&gt;'。如果仅指定属性名称而未进行比较   运算符,默认情况下过滤器比较等于(=)。

(另请注意,您应该使用google.appengine.ext.ndb而不是google.appengine.ext.db,而且真的不应该在真实应用中自行实施身份验证/授权/散列/等等)