首页 \ 问答 \ 如何处理Google App Engine中的删除(Python)(How to handle delete in Google App Engine (Python))

如何处理Google App Engine中的删除(Python)(How to handle delete in Google App Engine (Python))

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

我正在创建一个应用程序来将图像存储到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>

I'm a newbie programmer and new to Google App Engine and webapp2 etc. So this may be a very basic question.

I am creating an application to store images into BlobStore. My model stores description, blob_key, image url and date.

I am able to save everything, so that bit is okay.

But now I want to create a delete button which will not only delete an item from the datastore, but also delete the image saved in the blobstore.

I have created a DeleteHandler, and in the html I have a form, passing the key for the item I want to delete. In the DeleteHandler, I am using the posted key to delete the item from the datastore. I am also trying to use the key to use it delete the image saved in the blobstore.

So far I'm getting a 404 on the delete form post, and even if I get past that, I'm not sure if my DeleteHandler is correct to handle the functionality I am looking for.

Any help would be much appreciated..

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>

原文:https://stackoverflow.com/questions/13432054
更新时间:2021-12-15 19:12

最满意答案

您可以在ListView构造函数中指定RecycleElement,而不是使用x:Arguments

<ListView ...>
  <x:Arguments>
    <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
  </x:Arguments>
</ListView>

You can specify RecycleElement in the ListView constructor instead using x:Arguments

<ListView ...>
  <x:Arguments>
    <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
  </x:Arguments>
</ListView>

相关问答

更多