2012-11-17 8 views
9

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> 

risposta

6

Le eliminazioni sono vicini. Una volta che hai una chiave, puoi eliminare le entità chiamando db.delete (chiave).
Per esempio, questo sarebbe qualcosa di simile:

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) 


vostra gestione degli URL in main.py è buona, quindi non è ovvio per me il motivo per cui si sta ottenendo un 404. Si potrebbe ricontrolla il tuo file app.yaml per assicurarti che tutti gli URL siano passati a main.py.
Ecco un esempio i gestori di app.yaml sezione URL:

handlers 
- url: /.* 
    script: main.app 


+0

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

+0

Vedo nel tuo prossimo post che hai capito. Sono contento che tu abbia funzionato. Grazie per la risposta e per farci conoscere i dettagli. –

+0

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

1

Got a farlo funzionare. Grazie Eric, il tuo era molto vicino. Avevo bisogno di usare blob_key.key().

codice finale è la seguente:

 
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('/')