本頁面說明如何在標準環境中,搭配 Python 3 執行階段使用 Blobstore API (其中一項舊版套裝服務)。應用程式可透過 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 架構的 WSGI 應用程式中,將 BlobstoreUploadHandler
和 BlobstoreDownloadHandler
類別用於 Python 3。您可以比較 Python 3 範例與 Python 2 範例程式碼,進一步瞭解程式碼變更差異。
範例:Flask 應用程式
在 Python 3 中,Blobstore 處理常式類別屬於 google.appengine.ext.blobstore
模組。如果是 Flask 應用程式,對 BlobstoreUploadHandler
和 BlobstoreDownloadHandler
類別中的方法進行的所有呼叫,都需要 request.environ
字典 (request
是從 flask
模組匯入)。
比較從 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 應用程式) 程式碼說明如何在使用 Blobstore 處理常式類別時,為沒有 Web 架構的 WSGI 應用程式新增 environ
參數。請注意 environ
參數在 get_uploads()
和 send_blob()
方法中的使用方式,並與 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。