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.
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
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? –
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