0

全て、

私は 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)

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

4

1 に答える 1

2

推測ですが、RequestHandler の self.username、self.password、および self.email が何も設定されていないと思われます。リクエストの POST データからこれらのパラメーターを取得していると思いますが、示されているコードではそれが行われていません。

もう 1 つの潜在的な問題は、クエリが最終的に整合性があり、最近の変更 (つまり、新しいユーザー エンティティ) を反映していない可能性があることです。filter() を介したクエリの代わりに、get() 呼び出しを使用してキーまたは ID でユーザーをフェッチすると、はるかに優れたものになります。

于 2013-08-28T02:55:20.723 に答える