我使用Google App Engine blobstore保存用户数据的blob --大小从几百字节到几百KB不等。blob_info另存为数据存储区实体上的属性。
在生产环境中,偶尔会出现从blobstore读取失败并显示BlobNotFoundError('',)的情况。异常没有提供任何细节,我也不知道为什么会发生故障。
根据谷歌的文档:
如果blob不引用实际的BlobStore值,则fetch_data将引发BlobNotFoundError。https://developers.google.com/appengine/docs/python/blobstore/functions#fetch_data
“fetch_data()函数找不到与给定的BlobInfo或BlobKey值对应的BlobStore值。”https://developers.google.com/appengine/docs/python/blobstore/exceptions#BlobNotFoundError
关于这一点,最令人困惑的是,失败是间歇性的。
下面是我对blobstore进行读/写的代码。仅当blob_info (从数据存储区读取)不是None时,才会尝试读取。
有什么建议吗?
def read(blob_info):
blob_reader = blobstore.BlobReader(blob_info.key(), buffer_size=358400)
try:
data = blob_reader.read()
finally:
blob_reader.close()
return data
def write(data, mime_type):
file_name = files.blobstore.create(mime_type=mime_type)
with files.open(file_name, 'a') as f:
f.write(data)
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)
# This is a hack to handle an apparent GAE delay synchronizing the blobstore
for i in range(1,3):
if blob_key:
break
else:
time.sleep(0.05)
blob_key = files.blobstore.get_blob_key(file_name)
new_blob_info = blobstore.BlobInfo.get(str(blob_key))
return new_blob_info发布于 2013-04-10 13:31:10
我认为你对GAE延迟的攻击是运行了三次都没有成功,这使得blob_key的值为None。在队伍中
new_blob_info = blobstore.BlobInfo.get(str(blob_key))
str(blob_key)将转换为“None”,即包含单词None的字符串。所以你返回的是一个带有键的blob_info,它只包含单词'None‘。
您可以通过在循环后检查显式的None来快速修复它。
正确的解决方法是以某种方式避免竞争条件,但我不知道为什么会发生这种情况;您的代码在我看来是正常的。我在Java上做了大致相同的操作,在那里它似乎工作得很好。请记住,blobstore文件支持是实验性的,并没有很好的文档记录。你能修改你的代码以使用原始的blobstore API (即上传URL)吗?
https://stackoverflow.com/questions/15663431
复制相似问题