This page describes how to use the Blobstore API, one of the legacy bundled services, with the Python 3 runtime for the standard environment. Your app can access the bundled services through the App Engine services SDK for Python 3 .
Overview
Since webapp is not supported in Python 3, you need to make some minimal changes when migrating Blobstore handler code from Python 2 to Python 3. To use the Blobstore API for Python 3, keep in mind the following:
-
Blobstore handler classes are utility classes. This means that the handler classes are no longer webapp-based, and you cannot use the
blobstore_handlersmodule provided by the webapp package (google.appengine.ext.webapp) or thewebapp2.RequestHandlerparameters in subclasses of these handlers. -
All of the methods in Blobstore handler classes require the WSGI
environdictionary as an input parameter.
The following sections show how to use BlobstoreUploadHandler
and BlobstoreDownloadHandler
classes for Python
3 in a Flask app and a WSGI app that does not use a Python framework. You can
compare the Python 3 examples with the Python 2 example code
to learn more about code change differences.
Example: Flask app
In Python 3, the Blobstore handler classes are part of module google.appengine.ext.blobstore
.
For a Flask app, all calls made to methods in BlobstoreUploadHandler
and BlobstoreDownloadHandler
classes require the request.environ
dictionary
( request
being imported from the flask
module).
Compare the code changes made from Python 2 (webapp2) to Python 3 (Flask). Notice how the
Flask app uses the request.environ
parameter in the methods get_uploads()
and 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)
To view the complete code sample for Python 3 (Flask), see GitHub .
Example: WSGI app without a web framework
The following Python 3 (WSGI app) code shows how to add the environ
parameter
when using Blobstore handler classes for a WSGI app without a web framework.
Notice how the environ
parameter is used in the get_uploads()
and send_blob()
methods,
and compare it with the Python 2 version:
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
To view the complete code sample for Python 3, see GitHub .

