我有一个简单的AppEngine处理程序,如下所示:
class TestGS(webapp2.RequestHandler):
def get(self):
file_name = '/gs/ds_stats/testfile'
files.gs.create(file_name, mime_type='text/html')
with files.open(file_name, 'a') as file_handle:
file_handle.write("foo")
files.finalize(file_name)
但是,当我调用此处理程序时,我会在ExistenceError: ApplicationError: 105
行获得with files.open(...
。
这看起来像一个超级简单的场景,并且根本没有迹象表明为什么会失败(特别是因为它上面的files.gs.create
似乎已经成功,但是,有没有办法验证这一点? )。
查看source code,我发现以下问题可能导致此错误:
if (e.application_error in
[file_service_pb.FileServiceErrors.EXISTENCE_ERROR,
file_service_pb.FileServiceErrors.EXISTENCE_ERROR_METADATA_NOT_FOUND,
file_service_pb.FileServiceErrors.EXISTENCE_ERROR_METADATA_FOUND,
file_service_pb.FileServiceErrors.EXISTENCE_ERROR_SHARDING_MISMATCH,
file_service_pb.FileServiceErrors.EXISTENCE_ERROR_OBJECT_NOT_FOUND,
file_service_pb.FileServiceErrors.EXISTENCE_ERROR_BUCKET_NOT_FOUND,
]):
raise ExistenceError()
这是一个非常广泛的问题...当然它并没有告诉我哪一个!再次,奇怪的是'创造'似乎有效。
答案 0 :(得分:2)
问题证明文件中缺乏明确性。 files.gs.create
会返回一个特殊的“可写文件路径”,您需要将其输入open
和finalize
。一个正确的例子如下:
class TestGS(webapp2.RequestHandler):
def get(self):
file_name = '/gs/ds_stats/testfile'
writable_file_name = files.gs.create(file_name, mime_type='text/html')
with files.open(writable_file_name, 'a') as file_handle:
file_handle.write("foo")
files.finalize(writable_file_name)