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