2013-04-27 21 views
5

Mam formularz, który zawiera, między polami tekstowymi, element do przesłania obrazu.
Chcę przechowywać obiekt blob w magazynie blobstore i odnosić go w moim modelu (ndb.Model) przy użyciu ndb.BlobKeyProperty().
Sposób pokazany na this link używa obsługi przesyłania (UploadHandler), która jest wywoływana z linkiem utworzonym w ten sposób:GAE Blobstore: przesyłanie bloba wraz z innymi polami tekstowymi

upload_url = blobstore.create_upload_url('/upload') 

upload_url jest działanie formularz na stronie stworzonej przesłać blob. Jednak mój formularz zawiera inne pola, które nie są przetwarzane w metodzie postu UploadHandler. Tymczasowe rozwiązanie znalazłem było stworzenie obsługi dla mojej postaci, która dziedziczy z mojego BaseHandler iz 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') 
     ... 

Ta metoda działa, oprócz tego, że mam do zdefiniowania nowego obsługi w main.py dla każdej strony, która ma blob zostać przesłane:

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

Pytanie: jak mogę użyć tylko jednego obsługi przesyłania (na przykład: UploadHandler), która jest wywoływana z różnych stron, aby wykonać zadanie przesłać blob? Wiem, że to może być bardzo proste dla doświadczonego programisty GAE, ale nie znalazłem rozwiązania w pobliżu.

+0

Jak dotąd wszystko, co wpisałeś, jest poprawne. Jeśli masz dwa osobne formularze, które muszą załadować obiekt typu blob, będą potrzebować dwóch oddzielnych modułów obsługi. Sensowne jest używanie tego samego programu obsługi, jeśli wszystkie pola formularza są takie same. – dragonx

+0

Co jeśli chcę mieć tylko jedną procedurę ładowania ('UploadHandler'), która jest używana zarówno przez' handlers.EditProfile' i 'handlers.EditBlob2Handler'? Czy to jest możliwe? W jaki sposób? –

+0

Jeśli formularze przesłane do dwóch procedur obsługi są takie same, a obie procedury obsługi są takie same, można po prostu skierować je do tego samego adresu URL, przekazując odpowiedni adres URL jako miejsce docelowe do create_upload_url(). Jeśli procedury obsługi są różne i robią różne rzeczy, byłoby to głupie pytanie. – dragonx

Odpowiedz

0

Krótka odpowiedź: Tak, możesz.

Program obsługi to tylko kod, który analizuje formularz przesyłania, a następnie wykonuje czynność na podstawie tych informacji.

Technicznie, możesz mieć jeden formularz nawet dla różnych ładowań, ale to naprawdę zależy od tego, jak różne i czy chcesz podzielić kod.

Na przykład, jeśli formularz1 prześle "Imię" "Nazwisko" "Ulubiony kolor", a formularz 2 prześle "Imię" "Nazwisko" "Numer ulubiony", to procedura obsługi/upload może po prostu odczytać parametr i przetwarzać je inaczej.

Jeśli (req.getParameter ("Favorite_Number")! = Null) {} Czy cokolwiek

else if (req.getParameter ("Favorite_Color")! = Null) {} Czy cokolwiek

To tylko kwestia projektu. Twoje pytanie, czy MOŻESZ korzystać z jednego przewodnika, odpowiedź brzmi "tak". Zaleca się jednak używanie innych, jeśli różnią się one funkcjonalnie.

Powiązane problemy