2012-11-01 28 views
0

我有一个简单的AppEngine处理程序如下:“ExistenceError”在简单的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) 

然而,当我把这个处理程序,我在该行with files.open(...得到ExistenceError: ApplicationError: 105

这似乎是一个超级简单的场景,并没有任何迹象表明,为什么这是失败的(特别是因为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() 

这是一个相当大的一系列问题......当然它并没有告诉我哪一个!再次,奇怪的是,“创造”似乎有效。

回答

2

问题原来是在文档中缺乏清晰度。 files.gs.create返回一个特殊的“可写入文件路径”,您需要将其输入到openfinalize。正确的示例如下所示:

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)