请原谅这个模糊的标题,我不知道还能怎么说。
我有一个任务工作者请求处理程序,它从URL获取数据并将其写入blobstore,然后将数据的blob_key保存到数据存储中的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_key并且成功地写入了数据。我不明白是什么原因救了我的命,请帮帮忙。
发布于 2012-02-08 13:34:03
在没有更多信息的情况下,很难确定发生了什么。这是我有根据的猜测:
在get()和save_data()中都调用MyModel.get(itemKey)。我猜想它会返回两个不同的对象来表示项目。在save_data中更新blobKey时,更新仅发生在save_data中获取的对象中。当您稍后在该范围之外检查它时,您看到的是一个不同的对象。
这是否正确将取决于MyModel.get()的实现。
另外,您应该知道您调用了item.put()两次,对吧?
发布于 2012-02-08 16:15:29
问题就在这里
finally:
item.put()这一次调用覆盖了save_data()保存的数据,因为它引用了一个较旧的item对象。
我的建议是,你可以从save_data()进行状态更新,比如item.status = 'success',或者将item = MyModel.get(itemKey)移到save_data()之后,这样你就可以获取更新后的对象了。
发布于 2012-02-08 15:41:07
问题是,当您使用item = MyModel.get(itemKey)调用save_data()时,您最终拥有两个不同的对象,因此覆盖了save_data()中的一个对象,因此当您转到模型数据存储时,blobkey的数据不会存储为被覆盖的数据。
尝试在类中执行所有操作,否则不要两次使用item = MyModel.get(itemKey)。
https://stackoverflow.com/questions/9188139
复制相似问题