GAE放对象,重定向,然后查询对象返回null?

时间:2013-08-28 02:10:04

标签: google-app-engine cookies python-2.7 google-cloud-datastore webapp2

全部,

我正在学习Google App Engine / Webapp2,我无法将对象保存到数据存储区,重定向到另一个页面/处理程序,然后从数据存储区中提取该对象。如果对这个问题有一个简单的答案,请原谅我。以下是我所拥有的代码的描述。

我有一个基本处理程序:

    class BaseHandler(webapp2.RequestHandler):

    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 get_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', str(user.name))

    # Called before every request and stores user object
    def initialize(self, *a, **kw):
        webapp2.RequestHandler.initialize(self, *a, **kw)
        username = self.get_secure_cookie('user')
        self.user = username and User.by_name(str(username))

我有一个继承自BaseHandler的注册页面:

class Signup(BaseHandler):
    def get(self):
        # Get the page

    def post(self):
        has_error = False

    # Extract and validate the input

        if has_error:
            #Re-render the form

        else:
            new_user = User.register(self.username, self.password, self.email)

            new_user.put()
            self.login(new_user)

            self.redirect("/blog/welcome")

如果用户是新用户,则创建User db.Model对象,将用户存储到数据存储区,设置用户cookie并将我们重定向到Welcome处理程序:

class Welcome(BaseHandler):
    def get(self):
        if self.user:
            self.render('welcome.html', username = self.user.name)
        else:
            self.redirect('/blog/signup')

这里的意图是,在重定向时,将调用BaseHandler.initialize()并设置我刚创建的新用户的self.user。

以下是我所知道的:
- 注册新用户时,我被重定向回注册页面 - 如果我然后手动导航到/ blog / welcome,则会在填充新用户名的情况下正确加载页面。

如果我将以下日志记录语句添加到Welcome.get():

username = self.get_secure_cookie('user')
logging.info("Cookie %r obtained inside of Welcome.get().", username)
logging.info("Found user %r", User.by_name(str(username)))

获取新用户名的cookie,但未找到User对象。同样,如果我直接导​​航到/ blog / welcome,日志会报告已获取cookie并为新用户找到User对象。

User对象如下所示:

def users_key(group = 'default'):
    return db.Key.from_path('users', group)

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

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

    @classmethod
    def register(cls, name, password, email = None):
    return User(parent = users_key(),
                name = name,
                password = password,
                email = email)

是否存在导致第一个查询导致新用户无法返回的数据存储区?我该如何进行调试呢?我还应该做些额外的阅读吗? (我试图提供所有必要的代码片段,但如果需要,我可以提供额外的代码。)

1 个答案:

答案 0 :(得分:2)

猜测,但我怀疑RequestHandler中的self.username,self.password和self.email没有设置为任何内容。我假设您从请求POST数据中获取了这些参数,但是在所显示的代码中没有发生这种情况。

另一个潜在的问题是您的查询最终是一致的,并且可能无法反映最近的更改(即新的用户实体)。如果你通过get()调用而不是通过filter()调用来获取用户的密钥或id,那会好得多。