【问题标题】:GAE put object, redirect, then query for object returns null?GAE放对象,重定向,然后查询对象返回null?
【发布时间】:2013-08-30 23:04:41
【问题描述】:

全部,

我正在学习 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,但没有找到用户对象。同样,如果我直接导​​航到 /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)

导致第一个查询让新用户什么也不返回的数据存储是否存在某些问题?我应该如何进行调试?我应该做额外的阅读吗? (我已尝试提供所有必要的代码 sn-ps,但如果需要,我可以提供其他代码。)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我正在提取参数,我只是试图排除尽可能多的代码,因为这已经是一篇很长的帖子了。我做了一个小的更新来澄清。
    • 今晚我将尝试不同的方法从数据存储中获取对象。我怀疑这可能与云数据存储的运行方式有关......
    • 谢谢@dragonx。如果我将用户 ID 存储在 cookie 中,然后使用 by_id 搜索(未显示),那么这个问题就会消失。
    • 太好了,听起来这是最终一致的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2021-09-14
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多