Nesta página, descrevemos como usar a API Blobstore, um dos serviços em pacote legados, com o ambiente de execução do Python 3 para o ambiente padrão. O aplicativo pode acessar os serviços incluídos pelo SDK de serviços do App Engine para Python 3.
Visão geral
Como o webapp não é compatível com o Python 3, você precisa fazer algumas alterações mínimas ao migrar o código do gerenciador do Blobstore do Python 2 para o Python 3. Para usar a API Blobstore para Python 3, considere o seguinte:
As classes de gerenciador do Blobstore são classes utilitárias. Isso significa que as classes do gerenciador não são mais baseadas em webapp e não é possível usar o módulo
blobstore_handlersfornecido pelo pacote do webapp (google.appengine.ext.webapp) ou os parâmetroswebapp2.RequestHandlerem subclasses desses gerenciadores.Todos os métodos nas classes de gerenciador do Blobstore exigem o dicionário
environdo WSGI como um parâmetro de entrada.
As seções a seguir mostram como usar as classes BlobstoreUploadHandler e
BlobstoreDownloadHandler para Python
3 em um aplicativo Flask e um aplicativo WSGI que não usa um framework Python. É possível
comparar os exemplos do Python 3 com o
código de exemplo do Python 2
para saber mais sobre diferenças de mudança de código.
Exemplo: aplicativo Flask
No Python 3, as classes de gerenciador do Blobstore fazem parte do módulo
google.appengine.ext.blobstore.
Para um app Flask, todas as chamadas feitas para métodos nas classes BlobstoreUploadHandler e
BlobstoreDownloadHandler exigem o dicionário request.environ
(request sendo importado do módulo flask).
Compare as alterações de código feitas no Python 2 (webapp2) com o Python 3 (Flask). Veja como o aplicativo
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: aplicativo WSGI sem um framework da Web
O código para Python 3 (aplicativo WSGI) a seguir mostra como adicionar o parâmetro environ
ao usar classes de gerenciador do Blobstore para um aplicativo WSGI sem um framework da Web.
Observe 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 (Flask), consulte o GitHub.