我是一名新手程序员,也是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>
答案 0 :(得分: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
答案 1 :(得分: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('/')