本页面介绍如何将 Blobstore API(一种旧版捆绑服务)与标准环境中的 Python 3 运行时搭配使用。您的应用可以通过 Python 3 版 App Engine 服务 SDK 访问捆绑服务。
概览
由于 Python 3 不支持 webapp,因此在将 Blobstore 处理程序代码从 Python 2 迁移到 Python 3 时,需要进行一些细微更改。要使用适用于 Python 3 的 Blobstore API,请注意以下事项:
Blobstore 处理程序类是实用程序类。这意味着处理程序类不再基于 webapp,因此您无法使用 webapp 软件包 (
google.appengine.ext.webapp
) 提供的blobstore_handlers
模块或这些处理程序的子类中的webapp2.RequestHandler
参数。Blobstore 处理程序类中的所有方法都需要将 WSGI
environ
字典作为输入参数。
以下部分介绍了如何在 Flask 应用中使用适用于 Python 3 的 BlobstoreUploadHandler
和 BlobstoreDownloadHandler
类,以及不使用 Python 框架的 WSGI 应用。您可以将 Python 3 示例与 Python 2 示例代码进行比较,以详细了解代码更改差异。
示例:Flask 应用
在 Python 3 中,Blobstore 处理程序类是模块 google.appengine.ext.blobstore
的一部分。对于 Flask 应用,对 BlobstoreUploadHandler
和 BlobstoreDownloadHandler
类中的方法进行的所有调用都需要 request.environ
字典(需要从 flask
模块导入 request
)。
比较从 Python 2 (webapp2) 到 Python 3 (Flask) 发生的代码更改。请注意 Flask 应用在 get_uploads()
和 send_blob()
方法中使用 request.environ
参数的方式:
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)
如需查看 Python 3 (Flask) 的完整代码示例,请参阅 GitHub。
示例:没有网络框架的 WSGI 应用
以下 Python 3(WSGI 应用)代码展示了如何在没有网络框架的 WSGI 应用上使用 Blobstore 处理程序类时添加 environ
参数。注意 get_uploads()
和 send_blob()
方法如何使用 environ
参数,并将其与 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
如需查看 Python 3 的完整代码示例,请参阅 GitHub。