【发布时间】: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