2012-11-17 67 views
9

Tôi là lập trình viên mới và mới sử dụng Google App Engine và webapp2, v.v. Vì vậy, đây có thể là một câu hỏi rất cơ bản.Cách xử lý xóa trong Google App Engine (Python)

Tôi đang tạo một ứng dụng để lưu trữ hình ảnh vào BlobStore. Mô hình của tôi lưu trữ mô tả, blob_key, url hình ảnh và ngày tháng.

Tôi có thể lưu mọi thứ, để bit đó ổn.

Nhưng bây giờ tôi muốn tạo một nút xóa sẽ không chỉ xóa một mục từ kho dữ liệu, mà còn xóa hình ảnh được lưu trong kho màu.

Tôi đã tạo Trình xóa, và trong html tôi có biểu mẫu, chuyển khóa cho mục tôi muốn xóa. Trong DeleteHandler, tôi đang sử dụng khóa được đăng để xóa mục khỏi kho dữ liệu. Tôi cũng đang cố gắng sử dụng chìa khóa để sử dụng nó xóa hình ảnh được lưu trong blobstore.

Cho đến giờ tôi nhận được 404 trên bài đăng xóa biểu mẫu và thậm chí nếu tôi vượt qua điều đó, tôi không chắc liệu Trình quản lý DeleteHandler của tôi có chính xác không để xử lý chức năng tôi đang tìm kiếm.

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao ..

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> 

Trả lời

6

Các xóa gần. Một khi bạn có một khóa, bạn có thể xóa các thực thể bằng cách gọi db.delete (key).
Ví dụ của bạn, đây sẽ là một cái gì đó như thế này:

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) 


xử lý url của bạn trong main.py là tốt, vì vậy nó không rõ ràng với tôi lý do tại sao bạn đang nhận được một 404. Bạn có thể kiểm tra kỹ tệp app.yaml của bạn để đảm bảo tất cả các url được chuyển đến main.py.
Đây là một mẫu xử lý app.yaml url phần:

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


+0

Nhờ sự giúp đỡ của bạn với Eric này. Nó gần như hoạt động ngay bây giờ, ngoại trừ mục đó không bị xóa khỏi blobstore. Tôi đã thử blobstore.delete (item.key) và blobstore.delete ([item.key]). Dường như không làm thủ thuật – user791793

+0

Tôi thấy trong bài đăng tiếp theo của bạn mà bạn đã tìm ra. Tôi vui vì bạn đã làm nó hoạt động. Cảm ơn bạn đã trả lời và cho chúng tôi biết chi tiết. –

+0

Cảm ơn Eric, đánh dấu câu trả lời của bạn bằng một dấu tích, nhìn thấy khi bạn chỉ ra để sử dụng blobstore.delete (KEY) là một phần quan trọng trong việc tìm ra điều này – user791793

1

Got nó để làm việc. Cảm ơn Eric, bạn thật sự thân thiết. Tôi cần sử dụng blob_key.key().

mã cuối cùng là sau đây:

 
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('/') 
Các vấn đề liên quan