Esta página descreve como usar a API Blobstore, um dos serviços agrupados antigos, com o tempo de execução do Python 3 para o ambiente padrão. A sua app pode aceder aos serviços incluídos através do SDK dos serviços do App Engine para Python 3.
Vista geral
Uma vez que a app Web não é suportada no Python 3, tem de fazer algumas alterações mínimas quando migrar o código do controlador Blobstore do Python 2 para o Python 3. Para usar a API Blobstore para Python 3, tenha em atenção o seguinte:
As classes de processadores do Blobstore são classes de utilidade. Isto significa que as classes de processadores já não se baseiam na app Web e não pode usar o módulo
blobstore_handlersfornecido pelo pacote da app Web (google.appengine.ext.webapp) nem os parâmetroswebapp2.RequestHandlernas subclasses destes processadores.Todos os métodos nas classes do controlador Blobstore requerem o dicionário WSGI como um parâmetro de entrada.
environ
As secções seguintes mostram como usar as classes BlobstoreUploadHandler e BlobstoreDownloadHandler para Python 3 numa app Flask e numa app WSGI que não usa uma framework Python. Pode comparar os exemplos do Python 3 com o exemplo de código do Python 2 para saber mais sobre as diferenças de alteração de código.
Exemplo: app Flask
No Python 3, as classes de controlador Blobstore fazem parte do módulo
google.appengine.ext.blobstore.
Para uma app Flask, todas as chamadas feitas a métodos nas classes BlobstoreUploadHandler e BlobstoreDownloadHandler requerem o dicionário request.environ (request importado do módulo flask).
Compare as alterações de código feitas do Python 2 (webapp2) para o Python 3 (Flask). Repare como a app Flask usa o parâmetro request.environ nos métodos 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)
Para ver o exemplo de código completo para Python 3 (Flask), consulte o GitHub.
Exemplo: app WSGI sem uma framework Web
O seguinte código Python 3 (app WSGI) mostra como adicionar o parâmetro environ quando usar classes de controlador Blobstore para uma app WSGI sem uma framework Web.
Repare como o parâmetro environ é usado nos métodos get_uploads() e send_blob() e compare-o com a versão do 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
Para ver o exemplo de código completo para Python 3, consulte o GitHub.