2012-11-17 28 views
9

私は初心者のプログラマーで、Google App Engineとwebapp2などの新機能です。これは非常に基本的な質問かもしれません。Google App Engine(Python)で削除を処理する方法

イメージをBlobStoreに保存するアプリケーションを作成しています。私のモデルは、説明、blob_key、画像のURLと日付を格納します。

私はすべてを保存することができるので、ビットは大丈夫です。

しかし、私はデータストアからアイテムを削除するだけでなく、ブロブストアに保存されたイメージを削除する削除ボタンを作成したいと思います。

私は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に渡されていることを確認してください。

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


+0

感謝。アイテムがブロブストアから削除されていないことを除いて、現在はほとんど動作しています。私はblobstore.delete(item.key)とblobstore.delete([item.key])を試しました。いずれも、そのトリックをしていないようです。 – user791793

+0

あなたの次の記事で、あなたがそれを理解したことが分かります。あなたがうまく働いてうれしい。返信して詳細をお知らせいただきありがとうございます。 –

+0

ありがとうございました。Ericは、あなたの答えを目盛りでマークし、blobstore.delete(KEY)の使用を指摘しているのを見て、 – user791793

1

それが動作するようになった:
は、ここにURLセクションでは、サンプルapp.yamlをハンドラです。ありがとうエリック、あなたは本当に近いです。私は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('/') 
関連する問題