2012-11-17 20 views
9

में डिलीट को कैसे संभालें I'm a newbie प्रोग्रामर और Google App Engine और webapp2 आदि में नया है, इसलिए यह एक बहुत ही बुनियादी सवाल हो सकता है।Google App Engine (Python)

मैं ब्लॉबस्टोर में छवियों को स्टोर करने के लिए एक एप्लिकेशन बना रहा हूं। मेरा मॉडल विवरण, blob_key, छवि यूआरएल और तारीख स्टोर करता है।

मैं सबकुछ बचाने में सक्षम हूं, ताकि थोड़ा ठीक हो।

लेकिन अब मैं एक डिलीट बटन बनाना चाहता हूं जो न केवल डेटास्टोर से एक आइटम हटाएगा, बल्कि ब्लॉबस्टोर में सहेजी गई छवि को भी हटा देगा।

मैंने एक हटाएं हैंडलर बनाया है, और एचटीएमएल में मेरे पास एक फॉर्म है, जिस आइटम को मैं हटाना चाहता हूं उसके लिए कुंजी पास कर रहा हूं। DeleteHandler में, मैं डेटास्टोर से आइटम को हटाने के लिए पोस्ट की गई कुंजी का उपयोग कर रहा हूं। मैं ब्लॉबस्टोर में सहेजी गई छवि को हटाने के लिए कुंजी का उपयोग करने की कोशिश भी कर रहा हूं।

अभी तक मुझे डिलीट फॉर्म पोस्ट पर 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> 

उत्तर

6

हटाए गए करीब हैं। एक बार आपके पास कुंजी हो जाने के बाद, आप db.delete (कुंजी) को कॉल करके इकाइयों को हटा सकते हैं।
अपने उदाहरण के लिए, इस कुछ इस तरह होगा:

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 में आपका यूआरएल हैंडलिंग अच्छा है, तो यह मेरे लिए स्पष्ट नहीं है कि आप एक 404. आप सका हो रही है यह सुनिश्चित करने के लिए कि सभी यूआरएल main.py पर पास हो जाएं, अपनी app.yaml फ़ाइल को दोबारा जांचें।

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


+0

इस एरिक के साथ आपकी मदद के लिए धन्यवाद। यह अब लगभग काम कर रहा है, सिवाय इसके कि आइटम को ब्लॉबस्टोर से हटाया नहीं जा रहा है। मैंने blobstore.delete (item.key) और blobstore.delete ([item.key]) की कोशिश की है। न तो चाल – user791793

+0

ऐसा लगता है कि मैं आपकी अगली पोस्ट में देखता हूं जिसे आपने समझ लिया था। मैं खुश हूं कि आपका यह चलने लगा। हमें जवाब देने और विवरण जानने के लिए धन्यवाद। –

+0

धन्यवाद एरिक, अपने उत्तर को टिक के साथ चिह्नित करते हुए, जैसा कि आप blobstore.delete (KEY) का उपयोग करने के लिए इंगित करते हुए देखते हैं, यह पता लगाने का एक प्रमुख हिस्सा था – user791793

1

यह काम करने के लिए मिल गया:
यहां नमूने app.yaml संचालकों यूआरएल अनुभाग है। धन्यवाद एरिक, तुम्हारा असली बंद था। मुझे 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('/')