1

我一直在阅读一些类似的问题,但无法找到我可以实施的答案。我正在使用 Google App Engine 并使用 unicodecsv 进行简单的 CSV 导出,效果很好。此导出应该每天运行,并且每次都将结果保存为相同的 Blobstore 项,因此可以从相同的 URL 检索它。

我知道这不是 Blobstore 项目的初衷,但我也阅读了一些使其工作的文章。不幸的是,由于我不是一个经验丰富的程序员,我无法在我的情况下使用它。如果有人能给我一些关于如何实现这一点的意见,那就太好了。

class ShopExport(webapp2.RequestHandler):
  def get(self):
    shops = Shop.all()
    self.response.headers[str('Content-Type')] = str('application/csv')
    self.response.headers[str('Content-Disposition')] = str('attachment; filename="shops.csv"')
    writer = unicodecsv.writer(self.response.out, encoding='utf-8')
    writer.writerow(["id", "name", "domain", "category", "deeplink"])
    for shop in shops:
      writer.writerow(["'"+shop.keyname+"'", "'"+shop.name+"'", "'"+shop.url+"'", "'"+shop.category+"'", "'"+shop.url_aff+"'"])
4

2 回答 2

4

正如 Tim 指出的那样,您不能覆盖 blobstore 实体,但您可以每次创建一个新实体并记住为新实体提供服务的密钥:

class BlobKey(db.Model) :
    blob_key = db.StringProperty()

然后,在 cron 处理程序中,您可以:

blob_key = BlobKey.all().get()
blob = blobstore.get(blob_key)
if blob : blob.delete()
db.delete( blob_key )    # you don't need it anymore

file_name = files.blobstore.create( mime_type = 'text/csv')
with files.open(file_name, 'a') as f:
    f.write( your_content )

files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)

BlobKey( blob_key = str(blob_key) ).put()   # save the new key

最后,当您提供文件(在 a 中BlobstoreDownloadHandler)时,您只需:

blob_key = BlobKey.all().get()
if blobstore.get(blob_key):
    self.send_blob(blobstore.BlobInfo.get(blob_key),
        content_type = 'text/csv', save_as=True)    # False to mangle file name
else:
    self.error(404)
于 2013-03-24T04:48:21.550 回答
1

您不能覆盖 Blob 存储实体,只能将其删除。您无法控制 blob 存储密钥,因此您必须通过重定向到当前 blob 存储 URL 来保留/管理应用程序中的 URL。至于写入 blob 存储,请查看文件 api

https://developers.google.com/appengine/docs/python/blobstore/overview#Writing_Files_to_the_Blobstore

于 2013-03-24T00:33:56.393 回答