1

我有一个 ndb 模型

import os
class ProblemInvite(ndb.Model):
    email = nab.StringProperty(required=True)
    token = ndb.StringProperty(required=True, default=os.urandom(16).encode('hex'))

当我创建模型列表时,令牌是相同的:

import logging
for email in emails:
    problem_invite = ProblemInvite(email=email_address)
    logging.exception(problem_invite.token)

奇怪的是,每封邮件的邀请令牌都是一样的,这是怎么回事?谢谢。

4

1 回答 1

2

数据存储中的属性类型一次只能有一个默认值。从属性选项表中:

在此处输入图像描述

所以你的os.urandom(16).encode('hex')表达式只被评估一次。我不能 100% 确定何时,但我怀疑它会在应用程序部署时 - 上传数据存储模型时。

要解决此问题,只需在创建实体时删除默认值并显式指定属性值。

旁注:在 ndb 模型中使用默认值时,您需要特别小心更改这些默认值,因为在应用程序部署/更新时,数据存储中已经存在的实体的行为(即为受影响的属性返回的数据)可能会发生变化.

于 2016-10-18T11:45:30.900 回答