2012-11-17 89 views
9

我是新手程序員,也是Google App Engine和webapp2等的新手。所以這可能是一個非常基本的問題。如何處理Google App Engine中的刪除(Python)

我正在創建一個應用程序來將圖像存儲到BlobStore中。我的模型存儲說明,blob_key,圖像網址和日期。

我可以保存一切,所以這一點是好的。

但是現在我想創建一個刪除按鈕,它不僅會從數據存儲中刪除一個項目,而且還會刪除保存在blobstore中的圖像。

我已經創建了一個DeleteHandler,並且在html中我有一個窗體,爲要刪除的項目傳遞密鑰。在DeleteHandler中,我使用已發佈的密鑰從數據存儲中刪除項目。我也嘗試使用該鍵來刪除保存在Blobstore中的圖像。

到目前爲止,我在刪除表單帖子上得到了404,即使我過去了,我也不確定我的DeleteHandler是否正確處理我正在尋找的功能。

任何幫助將不勝感激..

Main.py:

import os 
import urllib 
import webapp2 
from google.appengine.ext.webapp import template 
from google.appengine.ext import blobstore 
from google.appengine.ext.webapp import blobstore_handlers 
from google.appengine.api import images 
#Models 
from google.appengine.ext import db 

class ImageItem(db.Model): 
    description = db.StringProperty(required=True) 
    img_url = db.StringProperty() 
    blob_key = blobstore.BlobReferenceProperty() 
    when = db.DateTimeProperty(auto_now_add=True) 


#Handlers (Views) 
class MainHandler(webapp2.RequestHandler): 
    def get(self): 
    upload_url = blobstore.create_upload_url('/upload') 
    imgs = db.GqlQuery(
     'SELECT * FROM ImageItem ' 
     'ORDER BY when DESC') 
    imgs_dict = {'imgs': imgs} 
    self.response.out.write(template.render('main.html',locals())) 

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): 
    def post(self): 
    f = self.get_uploads('file')[0] # 'file' is file upload field in the form 
    img =ImageItem(description=self.request.get('description')) 
    img.blob_key = f.key() 
    img.img_url = images.get_serving_url(f.key()) 
    img.put() 
    self.redirect('/') 

class DeleteHandler(webapp2.RequestHandler): 
    def post(self): 
     key = self.request.get('k') 
     item = db.get(key) 
     images.delete(item.blob_key) 
     item.delete() 
     self.response.out.write(key) 

#URL Routing happens here 
app = webapp2.WSGIApplication([('/', MainHandler), 
           ('/upload', UploadHandler), 
           ('/delete', DeleteHandler)], 
           debug=True) 

main.html中:

<form action="{{upload_url}}" method="POST" enctype="multipart/form-data"> 
      <p> 
       <label for="file">Upload File</label> 
       <input type="file" name="file" id="file"> 
      </p> 
      <p> 
       <label for="description">Description</label> 
       <input type="text" id="description" name="description"> 
      </p> 
      <input type="submit" name="submit" value="Submit"> 
    </form> 

    <ul> 
     {% for i in imgs %} 
     <li> 
      <img src="{{i.img_url}}=s400-c" alt=""> 
      {{i.description }} 
      </li> 

     <li>{{i.when }}</li> 
     <li> 
      <form action="/delete" method="POST" enctype="multipart/form-data"> 
       <input type="text" name="k" value="{{i.key}}" /> 
       <input type="submit" value="delete"> 
      </form> 

     </li> 
     {% endfor %} 
    </ul> 

回答

6

的刪除是密切。一旦你有一個密鑰,你可以通過調用db.delete(key)來刪除實體。
對於你的榜樣,這將是這樣的:

class DeleteHandler(webapp2.RequestHandler): 
    def post(self): 
     key = self.request.get('k') 
     item = db.get(key) 
     blobstore.delete([item.blob_key]) 
     db.delete(item) 
     self.response.out.write(key) 


在main.py你的URL處理好,所以這不是明顯對我,爲什麼你得到一個404,你可以仔細檢查你的app.yaml文件,確保所有的URL都傳遞給main.py。
下面是一個示例的app.yaml處理程序的URL部分:

handlers 
- url: /.* 
    script: main.app 


+0

感謝您與此埃裏克你的幫助。它現在幾乎可以工作,除了該項目不會從Blobstore中刪除。我試過blobstore.delete(item.key)和blobstore.delete([item.key])。似乎沒有這樣的伎倆 – user791793

+0

我在你的下一篇文章中看到你發現了它。真高興你做到了。感謝您回覆並讓我們知道細節。 –

+0

謝謝埃裏克,用勾號標記你的答案,看到你指出使用blobstore.delete(KEY)是解決這個問題的主要部分 – user791793

1

得到它的工作。謝謝埃裏克,你真的很接近。我需要使用blob_key.key()。

最終的代碼如下:

 
class DelHandler(webapp2.RequestHandler): 
    def post(self): 
    key = self.request.get('k') 
    item = db.get(key) 
    n = item.blob_key.key() 
    blobstore.delete(n) 
    item.delete() 
    self.redirect('/') 
相關問題