GAE Python - 每天将CSV保存到相同的Blobstore元素的任务

时间:2013-03-23 15:54:38

标签: python google-app-engine csv blobstore

我一直在阅读一些类似的问题,但未能找到我可以实施的答案。我正在使用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+"'"])

2 个答案:

答案 0 :(得分: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

最后,当您提供文件时(在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)

答案 1 :(得分:1)

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

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