2013-03-23 25 views
1

我一直在閱讀一些類似的問題,但無法找到可以實現的答案。我正在使用Google App Engine並使用unicodecsv進行簡單的CSV導出,這很好。此導出應該每天運行並且每次都將結果保存爲相同的Blobstore項目,因此可以從相同的URL中檢索。GAE Python - 每天將CSV保存到相同Blobstore元素的任務

我知道這不是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

正如蒂姆指出,你不能覆蓋Blob存儲實體,但你可以創建一個新的每次和記住的關鍵在於服務新的實體:

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) 
+0

非常感謝Lenik,這工作得非常好! – Vincent 2013-03-24 09:58:52

+0

@Vincent你非常歡迎! – lenik 2013-03-24 10:01:27