全部,
我正在学习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)
是否存在导致第一个查询导致新用户无法返回的数据存储区?我该如何进行调试呢?我还应该做些额外的阅读吗? (我试图提供所有必要的代码片段,但如果需要,我可以提供额外的代码。)
答案 0 :(得分:2)
猜测,但我怀疑RequestHandler中的self.username,self.password和self.email没有设置为任何内容。我假设您从请求POST数据中获取了这些参数,但是在所显示的代码中没有发生这种情况。
另一个潜在的问题是您的查询最终是一致的,并且可能无法反映最近的更改(即新的用户实体)。如果你通过get()调用而不是通过filter()调用来获取用户的密钥或id,那会好得多。