Sono un programmatore novizio e nuovo a Google App Engine e webapp2 ecc. Quindi questa potrebbe essere una domanda molto semplice.Come gestire l'eliminazione in Google App Engine (Python)
Sto creando un'applicazione per memorizzare immagini in BlobStore. Il mio modello memorizza descrizione, blob_key, immagine URL e data.
Sono in grado di salvare tutto, quindi quel bit va bene.
Ma ora voglio creare un pulsante di eliminazione che non solo eliminerà un elemento dal datastore, ma eliminerà anche l'immagine salvata nel blobstore.
Ho creato un DeleteHandler, e nel html ho un modulo, passando la chiave per l'elemento che voglio cancellare. In DeleteHandler, sto usando la chiave pubblicata per eliminare l'elemento dal datastore. Sto anche cercando di usare il tasto per usarlo per eliminare l'immagine salvata nel blobstore.
Finora ricevo un 404 nel post del modulo di eliminazione, e anche se riesco a superarlo, non sono sicuro che il mio DeleteHandler sia corretto per gestire la funzionalità che sto cercando.
Qualsiasi aiuto sarebbe molto apprezzato ..
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>
Grazie per il vostro aiuto con questo Eric. Funziona quasi subito, tranne che l'elemento non viene eliminato dal blobstore. Ho provato blobstore.delete (item.key) e blobstore.delete ([item.key]). Nessuno dei due sembra fare il trucco – user791793
Vedo nel tuo prossimo post che hai capito. Sono contento che tu abbia funzionato. Grazie per la risposta e per farci conoscere i dettagli. –
Grazie Eric, segnando la tua risposta con un segno di spunta, visto che ti stai segnalando di usare blobstore.delete (KEY) è stata una parte importante della comprensione di questo – user791793