Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GAE查询在第一次尝试时为空,而不是在第二次尝试时为空_Python_Html_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Python GAE查询在第一次尝试时为空,而不是在第二次尝试时为空

Python GAE查询在第一次尝试时为空,而不是在第二次尝试时为空,python,html,google-app-engine,google-cloud-datastore,Python,Html,Google App Engine,Google Cloud Datastore,我有一个表单,它将POST数据提交给处理程序,创建并放置一个名为Item的数据存储条目。然后它重定向页面并发送GET请求,其中数据存储条目的查询如下: query = Item.query() userLessons = query.filter(Item.author == thisUser) itemQuery = userLessons.filter(Item.name == itemName).fetch(1) desiredItem = itemQuer

我有一个表单,它将POST数据提交给处理程序,创建并放置一个名为Item的数据存储条目。然后它重定向页面并发送GET请求,其中数据存储条目的查询如下:

    query = Item.query()
    userLessons = query.filter(Item.author == thisUser)
    itemQuery = userLessons.filter(Item.name == itemName).fetch(1)
    desiredItem = itemQuery[0]

呈现的页面导致错误
UnboundLocalError:赋值前引用的局部变量'desiredItem'
。如果我只是刷新页面并发送另一个GET请求,数据存储条目就会神奇地出现。这怎么可能?在放置项目后,我尝试在重定向之前将相同的查询添加到文章的底部,但得到了相同的错误。有更好的查询方法吗?

数据存储操作是异步的。将实体插入数据存储后,实体在查询中变得可用需要几秒钟的时间。您有两种可能的解决方案:

  • 在将该实体保存到数据存储之前,将其添加到Memcache。在随后的请求中,首先检查Memcache,然后才查询数据存储。在大多数情况下,您根本不需要查询数据存储。这种方法会为你节省一些阅读费用

  • 因为您需要一个实体,所以根本不使用查询。使用实体的id检索实体:


  • 最好的解决方案是将这些方法结合起来。

    感谢您提供有关异步操作的提示。考虑在GET请求中尝试一个while循环,直到数据存储查询的长度大于0为止。只添加了一个实体,这是一个很少执行的操作。您不想为此执行循环。特别是,您的数据存储查询最终是一致的:。这意味着返回最新信息所需的时间可能比查询请求要长得多。如果需要查询返回最新的结果,则需要在创建模型时使用祖先并指定父级,从而使查询具有强一致性。@Patrick-get()操作始终具有强一致性。当您需要一个实体并且知道它的键时,就不需要祖先查询了。@AndreiVolgin我完全同意,使用get是正确的解决方案。我回应了user3220769关于执行循环并持续查询长度>0的评论。如果要这样做,他们将需要一个强一致性的查询(然后没有循环)。