【问题标题】:How to handle delete in Google App Engine (Python)如何在 Google App Engine (Python) 中处理删除
【发布时间】:2012-11-06 02:11:23
【问题描述】:

我是一个新手程序员,对 Google App Engine 和 webapp2 等都是新手。所以这可能是一个非常基本的问题。

我正在创建一个将图像存储到 BlobStore 的应用程序。我的模型存储描述、blob_key、图像 url 和日期。

我能够保存所有内容,所以那一点没关系。

但是现在我想创建一个删除按钮,它不仅可以从数据存储中删除一个项目,还可以删除保存在 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>

【问题讨论】:

    标签: python google-app-engine blobstore webapp2


    【解决方案1】:

    删除已关闭。一旦有了密钥,就可以通过调用 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
    


    【讨论】:

    • 感谢您对此 Eric 的帮助。它现在几乎可以工作了,除了该项目没有从 blobstore 中删除。我试过 blobstore.delete(item.key) 和 blobstore.delete([item.key])。似乎都没有成功
    • 我在你的下一篇文章中看到你想通了。真高兴你做到了。感谢您回复并告知我们详情。
    • 感谢 Eric,用勾号标记您的答案,因为您指出使用 blobstore.delete(KEY) 是解决这个问题的主要部分
    【解决方案2】:

    让它工作。谢谢埃里克,你的真的很接近。我需要使用 blob_key.key()。

    最终代码如下:

    DelHandler 类(webapp2.RequestHandler): def post(自我): key = self.request.get('k') 项目 = db.get(key) n = item.blob_key.key() blobstore.delete(n) 项目.删除() self.redirect('/')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2013-09-09
      • 2020-02-10
      • 2015-04-25
      • 1970-01-01
      • 2012-05-05
      • 2023-03-22
      相关资源
      最近更新 更多