Python 尝试中的神秘行为

Python 尝试中的神秘行为,python,google-app-engine,google-cloud-datastore,blobstore,Python,Google App Engine,Google Cloud Datastore,Blobstore,请原谅这个模糊的标题,我不知道该怎么说 我有一个任务工作者请求处理程序,它从URL获取数据并将其写入blobstore,然后将数据的blob_键保存到数据存储中的ListProperty。为了清晰起见,我尝试简化代码: class Fetch(webapp2.RequestHandler): def get(self): url = self.request.get('url') itemKey = self.request.get('itemKey')

请原谅这个模糊的标题,我不知道该怎么说

我有一个任务工作者请求处理程序,它从URL获取数据并将其写入blobstore,然后将数据的blob_键保存到数据存储中的ListProperty。为了清晰起见,我尝试简化代码:

class Fetch(webapp2.RequestHandler):
    def get(self):

        url = self.request.get('url')
        itemKey = self.request.get('itemKey')
        item = MyModel.get(itemKey)

        try:
            result = urlfetch.fetch(url=url)
            if result.status_code == 200:
                saveDataResult = save_data(result.content, itemKey)
                if saveDataResult is False:
                    raise Exception('error saving data')
            else:
                raise Exception('error fetching data: %s' % result.status_code)

            item.status = 'success'
        except Exception:
            item.status = 'failed'
        finally:
            item.put()

def save_data(data, itemKey)
    try:
        #write data to blobstore and get its blob_key...
        blob_key = files.blobstore.get_blob_key(file_name)
        item = MyModel.get(itemKey)
        item.blobKey.append(blob_key)
        item.put()

        return True
    except:
        return False

现在的问题是,当saveDataResult返回True时,其状态设置为“success”,但其blobKey属性不包含任何值,即使生成了blob_键并成功写入了数据。我看不出是什么原因导致这件事救了我的命,请帮忙。

没有更多的信息,很难确定发生了什么。以下是我的猜测:

MyModel.get(itemKey)
get()
save_data()
中都被调用。我推测它返回两个不同的对象来表示该项目。当blobKey在
save\u data
中更新时,更新仅发生在
save\u data
中获取的对象中。当您稍后在该范围之外检查它时,您看到的是另一个对象

这是否正确将取决于
MyModel.get()
的实现


另外,您确实意识到调用了两次
item.put()
,对吗?

如果没有更多信息,很难确定发生了什么。以下是我的猜测:

MyModel.get(itemKey)
get()
save_data()
中都被调用。我推测它返回两个不同的对象来表示该项目。当blobKey在
save\u data
中更新时,更新仅发生在
save\u data
中获取的对象中。当您稍后在该范围之外检查它时,您看到的是另一个对象

这是否正确将取决于
MyModel.get()
的实现


另外,您确实意识到调用了两次
item.put()
,对吗?

问题是,当您使用
item=MyModel.get(itemKey)
调用
save_data()
时 从类Fetch中再次调用,最终会有两个不同的对象,因此会覆盖save_data()中的一个对象,因此当您转到模型数据存储时,不会将blobkey的任何数据存储为其覆盖对象


尝试在类中执行所有操作,或者不要使用
item=MyModel.get(itemKey)
两次。

问题是,当您使用
item=MyModel.get(itemKey)
调用
save_data()
时 从类Fetch中再次调用,最终会有两个不同的对象,因此会覆盖save_data()中的一个对象,因此当您转到模型数据存储时,不会将blobkey的任何数据存储为其覆盖对象

尝试在类中执行所有操作,或者不要使用
item=MyModel.get(itemKey)
两次。

问题就在这里

finally:
    item.put()
此单个调用将覆盖由
save_data()
保存的数据,因为它引用的是项的旧对象

我建议您从
save_data()
进行状态更新,即
item.status='success'
或者将
item=MyModel.get(itemKey)
移到
save_data()
之后,以便可以获取更新的对象。

问题就在这里

finally:
    item.put()
此单个调用将覆盖由
save_data()
保存的数据,因为它引用的是项的旧对象

我建议您从
save_data()
进行状态更新,即
item.status='success'

或者将
item=MyModel.get(itemKey)
移动到
save_data()
之后,以便获取更新的对象。

您尚未显示
blob_key
(不是
item.blobKey
)获取值的部分。。。或者这就是问题所在?我已经添加了它,但我不能这样做,因为如果无法获取blob_密钥,save_data将返回False。我很确定这不是原因。您没有显示
blob_key
(不是
item.blobKey
)获取值的部分。。。或者这就是问题所在?我已经添加了它,但我不能这样做,因为如果无法获取blob_密钥,save_data将返回False。我很确定这不是原因。所以我想我应该从get()传递item的实例,以将_数据保存为参数?我现在正在尝试。所以我想我应该从get()传递item的实例以将_数据保存为参数?我现在正在尝试。