9

私は初心者プログラマーで、Google App Engine や webapp2 などは初めてです。したがって、これは非常に基本的な質問かもしれません。

画像を BlobStore に保存するアプリケーションを作成しています。私のモデルには、説明、blob_key、画像の URL、および日付が格納されています。

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

しかし、データストアからアイテムを削除するだけでなく、ブロブストアに保存された画像も削除する削除ボタンを作成したいと考えています。

私は DeleteHandler を作成しました。html には、削除するアイテムのキーを渡すフォームがあります。DeleteHandler では、投稿されたキーを使用してデータストアから項目を削除しています。また、ブロブストアに保存されている画像を削除するためにキーを使用しようとしています。

これまでのところ、削除フォームの投稿で 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>
4

2 に答える 2

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


于 2012-11-21T13:34:05.027 に答える
1

動作するようになりました。ありがとうエリック、あなたは本当に近かった。blob_key.key() を使用する必要がありました。

最終的なコードは次のとおりです。

クラス DelHandler (webapp2.RequestHandler):
  デフポスト(自己):
    キー = self.request.get('k')
    項目 = db.get(キー)
    n = item.blob_key.key()
    blobstore.delete(n)
    item.delete()
    self.redirect('/')
于 2012-11-23T16:13:31.940 に答える