2

私には、それぞれID117138609372751079516と144229817858159123282の2人の模擬ユーザーJoとSamがいます。

アプリには次のエンティティがあります。

class MockEntity(ndb.Model):
    ownerId = ndb.StringProperty(default=users.get_current_user().user_id())

両方が同時にログインし、どちらかのユーザーがエンティティを初めて保存/配置すると、プロパティ'ownerId'にユーザーのIDのいずれかがランダムに入力されます:117138609372751079516または144229817858159123282

pre_put_hookを使用すると、問題が解決するようです。

def _pre_put_hook(self):
    if not self.ownerId:
        self.ownerId = users.get_current_user().user_id()

私は当面の問題を解決しましたが、そもそもなぜこれが起こっているのですか?これは、約50人のテスターのグループで開発および本番環境でテストされています。それらの約40%は、自分のものではないエンティティを見ることができました。

4

1 に答える 1

5

この問題は、 AppEngineランタイムインスタンスごとにクラスが最初ownerIdに作成されたときにのみ設定されるデフォルト値が原因である可能性があります。したがって、新しいApp Engineインスタンスが読み込まれると、最初のユーザーがクラスをPythonインタープリターに読み込むときにデフォルト値が設定されます。MockEntity

NDBでの同じ状況の説明については、Gotcha —PythonおよびAppEngineNDBでのこの古典的な問題の変更可能なデフォルト引数GotchaPicklePropertyのデフォルト値を参照してください。

于 2013-03-26T23:42:35.650 に答える