2012-11-17 14 views
9

Jestem początkującym programistą i nowicjuszem w Google App Engine i webapp2 itd. To może być bardzo podstawowe pytanie.Jak radzić sobie z usuwaniem w Google App Engine (Python)

Tworzę aplikację do przechowywania obrazów w BlobStore. Mój model zawiera opis, blob_key, adres URL obrazu i datę.

Jestem w stanie wszystko zapisać, więc bit jest w porządku.

Ale teraz chcę utworzyć przycisk usuwania, który nie tylko usunie element z magazynu danych, ale także usunie obraz zapisany w blobstore.

Utworzono DeleteHandler, aw html mam formularz, przekazując klucz do elementu, który chcę usunąć. W DeleteHandler używam klucza wysłanego, aby usunąć element z magazynu danych. Próbuję również użyć klawisza, aby go użyć, usunąć obraz zapisany w blobstore.

Do tej pory otrzymuję 404 na formularzu formularza usuwania, a nawet jeśli przejdę obok, nie jestem pewien, czy mój DeleteHandler jest poprawny do obsługi funkcji, której szukam.

Każda pomoc będzie mile widziane ..

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> 

Odpowiedz

6

W Usuwa są blisko. Po uzyskaniu klucza można usunąć encje, wywołując db.delete (klucz).
Dla przykładu, to byłoby coś takiego:

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) 


Twój manipulacja url w main.py jest dobra, więc nie jest to dla mnie oczywiste, dlaczego dostajesz 404. mogłeś dokładnie sprawdź plik app.yaml, aby upewnić się, że wszystkie adresy URL zostały przekazane do pliku main.py.
Oto próbka koparki app.yaml sekcja url:

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


+0

Dzięki za pomoc z tym Eric. Już prawie działa, z wyjątkiem tego, że element nie jest usuwany z blobstore. Próbowałem blobstore.delete (item.key) i blobstore.delete ([item.key]). Żadne z nich nie wygląda tak, jak się wydaje – user791793

+0

Widzę w twoim następnym poście, że to wymyśliłeś. Cieszę się, że to działa. Dziękujemy za udzielenie odpowiedzi i poinformowanie nas o szczegółach. –

+0

Dzięki Eric, zaznaczając swoją odpowiedź za pomocą haczyka, widząc, że wskazanie do użycia blobstore.delete (KEY) było głównym elementem w ustaleniu tego – user791793

1

Got go do pracy. Dzięki Eric, twój był naprawdę blisko. Musiałem użyć blob_key.key().

kod końcowy jest następujący:

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