Questa pagina descrive come utilizzare l'API Blobstore, uno dei servizi in bundle legacy, con l'ambiente di runtime Python 3 per l'ambiente standard. La tua app può accedere ai servizi in bundle tramite l'SDK dei servizi App Engine per Python 3.
Panoramica
Poiché webapp non è supportato in Python 3, devi apportare alcune modifiche minime quando esegui la migrazione del codice del gestore Blobstore da Python 2 a Python 3. Per utilizzare l'API Blobstore per Python 3, tieni presente quanto segue:
Le classi gestore Blobstore sono classi di utilità. Ciò significa che le classi di gestione non sono più basate su webapp e non puoi utilizzare il modulo
blobstore_handlers
fornito dal pacchetto webapp (google.appengine.ext.webapp
) o i parametriwebapp2.RequestHandler
nelle sottoclassi di questi gestori.Tutti i metodi nelle classi di gestione di Blobstore richiedono il dizionario WSGI
environ
come parametro di input.
Le sezioni seguenti mostrano come utilizzare le classi BlobstoreUploadHandler
e BlobstoreDownloadHandler
per Python 3 in un'app Flask e in un'app WSGI che non utilizza un framework Python. Puoi
confrontare gli esempi di Python 3 con il
codice di esempio di Python 2
per scoprire di più sulle differenze tra le modifiche al codice.
Esempio: app Flask
In Python 3, le classi di gestione Blobstore fanno parte del modulo
google.appengine.ext.blobstore
.
Per un'app Flask, tutte le chiamate ai metodi nelle classi BlobstoreUploadHandler
e
BlobstoreDownloadHandler
richiedono il dizionario request.environ
(request
importato dal modulo flask
).
Confronta le modifiche al codice apportate da Python 2 (webapp2) a Python 3 (Flask). Nota come l'app Flask utilizza il parametro request.environ
nei metodi get_uploads()
e send_blob()
:
Python 2 (webapp2)
class PhotoUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload = self.get_uploads()[0]
user_photo = UserPhoto(
user=users.get_current_user().user_id(),
blob_key=upload.key())
user_photo.put()
self.redirect('/view_photo/%s' % upload.key())
class ViewPhotoHandler(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, photo_key):
if not blobstore.get(photo_key):
self.error(404)
else:
self.send_blob(photo_key)
app = webapp2.WSGIApplication([
('/', PhotoUploadFormHandler),
('/upload_photo', PhotoUploadHandler),
('/view_photo/([^/]+)?', ViewPhotoHandler),
], debug=True)
Python 3 (Flask)
Per visualizzare l'esempio di codice completo per Python 3 (Flask), consulta GitHub.
Esempio: app WSGI senza framework web
Il seguente codice Python 3 (app WSGI) mostra come aggiungere il parametro environ
quando si utilizzano le classi di gestione Blobstore per un'app WSGI senza un framework web.
Nota come viene utilizzato il parametro environ
nei metodi get_uploads()
e send_blob()
e confrontalo con la versione Python 2:
Python 2
class PhotoUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload = self.get_uploads()[0]
user_photo = UserPhoto(
user=users.get_current_user().user_id(),
blob_key=upload.key())
user_photo.put()
self.redirect('/view_photo/%s' % upload.key())
class ViewPhotoHandler(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, photo_key):
if not blobstore.get(photo_key):
self.error(404)
else:
self.send_blob(photo_key)
app = webapp2.WSGIApplication([
('/', PhotoUploadFormHandler),
('/upload_photo', PhotoUploadHandler),
('/view_photo/([^/]+)?', ViewPhotoHandler),
], debug=True)
Python 3
Per visualizzare il esempio di codice completo per Python 3, consulta GitHub.