替换一个Blobstore文件

2 投票
1 回答
724 浏览
提问于 2025-04-17 10:48

我从blobstore中提供静态的KML文件,这个文件是我保存到blobstore里的。

class KMLHandler2(blobstore_handlers.BlobstoreDownloadHandler):

    def get(self):
        resource = 'AMIfv965WtxAc_rWOVjSSx423_oe6f-g5obWYNKX5scg-1gqvISyaZCnv6lRaqro2wOVNOogttyMOylFLsRYZ3Y9UYIe-A69vAt4pdJB2-SHUcdVEM2v0XVLxzT3fTlxwXQVhzmsHPwALH_rCSFIvmYcuV37asVD0Q'
        resource = str(urllib.unquote(resource))
        blob_info = blobstore.BlobInfo.get(resource)
        self.send_blob(blob_info)

这样做是可以的,但我想定期更新这个文件。这个文件是从/list.kml生成的,所以我可以直接从那里读取,但这样会超时。因此,我的计划是创建一个应用引擎的任务,读取list.kml中的文件,然后用相同的键把它写入blobstore。但是,我该怎么做呢?因为我看到的例子都是如何创建一个新文件。我在代码中有更新数据层的地方,但这并不常见。你能建议我在更新文件时该怎么做吗?我想保持键和ID不变,替换掉旧的blob,而不是写一个新的并刷新键。你能帮我吗?应用引擎的文档说明了如何写一个blobstore文件,但只讲了如何创建新的,我不知道如何编辑或替换一个已有的文件,给定它的键。我觉得这应该是我需要做的任务或定时任务,所以我来请教你。

我可以像文档中那样创建一个处理程序,但那是用来创建文件的,而不是修改或替换文件:

class CreateKMLHandler(webapp2.RequestHandler):
    def get(self):
        # Create the file
        file_name = files.blobstore.create(mime_type='application/octet-stream')

        # Open the file and write to it
        with files.open(file_name, 'a') as f:
          f.write('data')

        # Finalize the file. Do this before attempting to read it.
        files.finalize(file_name)

        # Get the file's blob key
        blob_key = files.blobstore.get_blob_key(file_name)

谢谢

更新

我尝试了这个代码来创建一个新文件,但出现了截止时间错误 applicationerror 5,我想这可能是超时问题。我该如何把它变成一个任务呢?

class CreateKMLHandler(webapp2.RequestHandler):
    def get(self):
        # Create the file
        file_name = files.blobstore.create(mime_type='application/octet-stream')

        url = 'http://montaoproject.appspot.com/list.kml'

        result = urlfetch.fetch(url)
        if not result.content:
            return

        # Open the file and write to it
        with files.open(file_name, 'a') as f:
          f.write(result.content)

        # Finalize the file. Do this before attempting to read it.
        files.finalize(file_name)

        # Get the file's blob key
        blob_key = files.blobstore.get_blob_key(file_name)
        self.out.write(blob_key)

1 个回答

2

一旦写入了数据块(blobs),就不能再修改了,只能读取或者删除。你可以使用数据存储实体来跟踪与特定的KML“文档”相关联的当前数据块键。

你可能还会对云存储API感兴趣( http://code.google.com/appengine/docs/python/googlestorage/overview.html ),这个API允许你通过创建同名的新对象来覆盖“桶”中的对象。

撰写回答