全て、
私は 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)
この最初のクエリで新しいユーザーが何も返さない原因となっているデータストアに関する何かがありますか? これをデバッグするにはどうすればよいですか? 私がしなければならない追加の読書はありますか?(必要なすべてのコード スニペットを提供しようとしましたが、必要に応じて追加のコードを提供できます。)