我有一个名为Conversation
的模型,其中一些字段包含date_created
和date_updated
DateTimePropterty
auto_now_add
和auto_now
。< / p>
如果我使用put()
方法更新模型,date_updated
字段会更新。
但是当我使用put_async
方法时,date_updated
字段中的值不会更新。
我也有使用Python的unittest.Testcase
的测试用例,它运行正常。
注意:当我使用put_async().get_result()
时,它会起作用。
样本模型类:
class Conversation(ndb.Model):
participants = ndb.StringProperty(repeated=True)
conversation_name = ndb.StringProperty()
date_created = ndb.DateTimeProperty(required=True, auto_now_add=True)
date_updated = ndb.DateTimeProperty(required=True, auto_now=True)
@staticmethod
def update_conversation_date_by_id(conversation_id):
conversation = Conversation.get_by_id(conversation_id) if conversation_id else None
if conversation is None:
raise CannotFindEntity("Given conversation_id is not found")
else:
conversation.put_async().get
return conversation
答案 0 :(得分:4)
如果请求处理程序在NDB put完成之前退出,那么put可能永远不会发生。
class MyRequestHandler(webapp2.RequestHandler):
def get(self):
acct = Account.get_by_id(users.get_current_user().user_id())
acct.view_counter += 1
future = acct.put_async()
# ...read something else from Datastore...
template.render(...)
future.get_result()
尝试添加类似该代码块中最后一行的内容以强制它等待。
在这个例子中,调用future.get_result有点傻了 应用程序从不使用NDB的结果。那段代码就在那里 确保请求处理程序在NDB放置之前不会退出 饰面;如果请求处理程序退出得太早,则put可能永远不会 发生。为方便起见,您可以使用装饰请求处理程序 @ ndb.toplevel。这告诉处理程序不要退出直到它 异步请求已完成。这反过来让你发送 请求而不用担心结果。
https://developers.google.com/appengine/docs/python/ndb/async
答案 1 :(得分:0)
当主线程停止时,异步方法停止执行(请求处理程序完成)...所以很可能你的代码没有执行。 这可以通过将@ ndb.toplevel添加到请求处理程序来防止。然后处理程序将等待你的异步完成。
https://developers.google.com/appengine/docs/python/ndb/async
async不允许您在请求处理程序完成时运行代码。 async允许您在同一请求处理程序线程上等待异步命令时运行其他(异步)命令:)