2013-04-27 12 views
5

Ho un modulo che include, tra i campi di testo, un elemento per caricare un'immagine.
Desidero memorizzare il BLOB nel blobstore e fare riferimento al modello (ndb.Model) utilizzando ndb.BlobKeyProperty().
Il metodo illustrato in this link utilizza un gestore di upload (UploadHandler) che è chiamato dal link creato in questo modo:GAE Blobstore: carica blob insieme ad altri campi di testo

upload_url = blobstore.create_upload_url('/upload') 

upload_url è l'azione modulo nella pagina creata per caricare il blob. Tuttavia, il mio modulo include altri campi che non sono elaborati nel metodo post UploadHandler. La soluzione temporanea che ho trovato era quello di creare un gestore per la mia forma che eredita dalla mia BaseHandler E da 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') 
     ... 

Questo metodo funziona, solo che devo definire un nuovo gestore in main.py per ogni pagina che ha un blob da caricare:

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

domanda: come posso usare un gestore unico upload (per esempio: UploadHandler) che viene chiamato da pagine diverse per eseguire l'operazione di upload blob? So che potrebbe essere molto semplice per un programmatore esperto di GAE, ma non ho trovato una soluzione in giro.

+0

Finora tutto ciò che hai inserito è corretto. Se hai due moduli separati che devono entrambi caricare un blob, avranno bisogno di due gestori separati. Ha senso usare lo stesso gestore se tutti i campi modulo sono uguali. – dragonx

+0

Che cosa succede se voglio avere un solo gestore di upload ('UploadHandler') che viene utilizzato da entrambi' handlers.EditProfile' e 'handlers.EditBlob2Handler'? È possibile? Come? –

+0

Se i moduli inviati per i due gestori sono uguali ei due gestori sono uguali, è possibile indirizzarli entrambi allo stesso url passando l'URL appropriato come destinazione a create_upload_url(). Se i conduttori sono diversi e fanno cose diverse, allora questa sarebbe una domanda stupida. – dragonx

risposta

0

Risposta breve: Sì, è possibile.

Il gestore è solo il codice che analizza il modulo di caricamento e quindi esegue l'azione in base alle informazioni.

Tecnicamente, è possibile avere un modulo anche per caricamenti diversi, ma in realtà dipende da quanto diverso e dal fatto che si desideri dividere il codice.

Ad esempio, se il modulo1 carica "Nome" "Cognome" "Colore preferito" e il tuo modulo2 carica "Nome" "Cognome" "Numero preferito", quindi il gestore/upload può semplicemente leggere il parametro e elaborarli in modo diverso.

Se (req.getParameter ("Favorite_Number")! = Null) {} Fate quello

else if (req.getParameter ("Favorite_Color")! = Null) {} Fate quello

E ' solo una questione di design. La tua domanda se si può o meno usare un gestore, la risposta è sì. Tuttavia, si consiglia di utilizzare diversi se sono funzionalmente diversi.

Problemi correlati