Python 尝试中的神秘行为
请原谅这个模糊的标题,我不知道该怎么说 我有一个任务工作者请求处理程序,它从URL获取数据并将其写入blobstore,然后将数据的blob_键保存到数据存储中的ListProperty。为了清晰起见,我尝试简化代码: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')
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的实例以将_数据保存为参数?我现在正在尝试。