2013-04-27 20 views
5

Tôi có một biểu mẫu bao gồm, giữa các trường văn bản, một phần tử để tải lên một hình ảnh.
Tôi muốn lưu trữ các đốm màu trong blobstore và tham khảo nó trong mô hình của tôi (ndb.Model) sử dụng ndb.BlobKeyProperty().
Các phương pháp thể hiện trong this link sử dụng một bộ xử lý tải lên (UploadHandler) được gọi từ liên kết được tạo ra theo cách này:GAE Blobstore: tải lên blob cùng với các trường văn bản khác

upload_url = blobstore.create_upload_url('/upload') 

upload_url là hình thức hành động trong trang tạo ra để tải lên các blob. Tuy nhiên, biểu mẫu của tôi bao gồm các trường khác không được xử lý trong phương thức đăng bài UploadHandler. Các giải pháp tạm thời tôi thấy là tạo ra một handler cho hình thức của tôi được thừa kế từ BaseHandler tôi AND từ BlobstoreUploadHandler:

class EditProfile(blobstore_handlers.BlobstoreUploadHandler, BaseHandler) 
    def get(self): 
     params['upload_url'] = blobstore.create_upload_url('/upload_blob1') 
     ... fields ... 

    def post(self): 
     upload_blob = self.get_uploads() 
     blob_key = upload_blob[0].key() 
     value_field1 = self.request.POST.get('field1') 
     value_field2 = self.request.POST.get('field2') 
     value_field3 = self.request.POST.get('field3') 
     ... 

Phương pháp này hoạt động, ngoại trừ việc tôi phải xác định một handler mới trong main.py cho mỗi trang mà có một blob được tải lên:

app = webapp2.WSGIApplication([ ('/upload_blob1', handlers.EditProfile), 
           ('/upload_blob2', handlers.EditBlob2Handler), 
           ('/serve/([^/]+)?', handlers.ServeHandler) ], 
           debug=os.environ['SERVER_SOFTWARE'].startswith('Dev'), config=webapp2_config) 

Câu hỏi: làm thế nào tôi có thể sử dụng một bộ xử lý tải lên duy nhất (ví dụ: UploadHandler) được gọi từ các trang khác nhau để thực hiện các nhiệm vụ upload blob? Tôi biết điều này có thể rất đơn giản cho một lập trình viên GAE có kinh nghiệm, nhưng tôi đã không tìm thấy một giải pháp xung quanh.

+0

Cho đến giờ mọi thứ bạn đã nhập đều chính xác. Nếu bạn có hai biểu mẫu riêng biệt mà cả hai đều cần tải lên một blob, chúng sẽ cần hai trình xử lý riêng biệt. Nó chỉ có ý nghĩa để sử dụng cùng một trình xử lý nếu tất cả các trường biểu mẫu giống nhau. – dragonx

+0

Điều gì sẽ xảy ra nếu tôi chỉ muốn có một trình xử lý tải lên ('UploadHandler') được sử dụng bởi cả' handlers.EditProfile' và 'handlers.EditBlob2Handler'? Điều đó có thể không? Làm sao? –

+0

Nếu các biểu mẫu được gửi cho hai trình xử lý giống nhau và hai trình xử lý giống nhau, thì bạn có thể chỉ dẫn chúng cả hai đến cùng một url bằng cách chuyển url thích hợp làm đích đến create_upload_url(). Nếu những người xử lý khác nhau và làm những việc khác nhau, thì đây sẽ là một câu hỏi ngớ ngẩn. – dragonx

Trả lời

0

Câu trả lời ngắn gọn: Có, bạn có thể.

Trình xử lý chỉ là mã phân tích biểu mẫu tải lên của bạn và sau đó thực hiện hành động dựa trên thông tin.

Về mặt kỹ thuật, bạn có thể có một biểu mẫu ngay cả đối với các video tải lên khác nhau, nhưng nó thực sự phụ thuộc vào mức độ khác nhau và bạn có muốn chia nhỏ mã hay không. Ví dụ: nếu form1 của bạn tải lên "First name" "Last name" "Favorite color" và your form2 tải lên "First name" "Last name" "Favorite number", thì trình xử lý/tải lên của bạn có thể chỉ cần đọc thông số và xử lý chúng khác nhau.

Nếu (req.getParameter ("Favorite_Number")! = Null) {} Hãy làm những gì

Else if (req.getParameter ("Favorite_Color")! = Null) {} Hãy làm những gì

Đó là chỉ là vấn đề thiết kế. Câu hỏi của bạn có hay không bạn CÓ THỂ sử dụng một trình xử lý, câu trả lời là có. Tuy nhiên, nó được khuyến khích sử dụng những cái khác nhau nếu chúng có chức năng khác nhau.

Các vấn đề liên quan