בדף הזה נסביר איך להשתמש ב-Blobstore API, אחד מהשירותים המצורפים מדור קודם, עם סביבת זמן הריצה של Python 3 בסביבה הרגילה. האפליקציה יכולה לגשת לשירותים הכלולים בחבילה באמצעות App Engine services SDK for Python 3.
סקירה כללית
מכיוון שאין תמיכה ב-webapp ב-Python 3, צריך לבצע כמה שינויים מינימליים כשמעבירים קוד של Blobstore handler מ-Python 2 ל-Python 3. כדי להשתמש ב-Blobstore API ל-Python 3, חשוב לזכור את הדברים הבאים:
מחלקות של תוכניות לטיפול ב-Blobstore הן מחלקות של כלי עזר. המשמעות היא שמחלקות ה-handler כבר לא מבוססות על webapp, ואי אפשר להשתמש במודול
blobstore_handlersשסופק על ידי חבילת webapp (google.appengine.ext.webapp) או בפרמטריםwebapp2.RequestHandlerבמחלקות משנה של ה-handler האלה.כל השיטות במחלקות של Blobstore handler דורשות את מילון ה-WSGI
environכפרמטר קלט.
בקטעים הבאים מוסבר איך להשתמש במחלקות BlobstoreUploadHandler ו-BlobstoreDownloadHandler ב-Python 3 באפליקציית Flask ובאפליקציית WSGI שלא משתמשת ב-framework של Python.
דוגמה: אפליקציית Flask
ב-Python 3, מחלקות ה-handler של Blobstore הן חלק מהמודול google.appengine.ext.blobstore.
באפליקציית Flask, כל הקריאות לשיטות במחלקות BlobstoreUploadHandler ו-BlobstoreDownloadHandler דורשות את המילון request.environ (request מיובא מהמודול flask).
השוואה בין שינויים בקוד שבוצעו מ-Python 2 (webapp2) ל-Python 3 (Flask). שימו לב איך אפליקציית Flask משתמשת בפרמטר request.environ בשיטות get_uploads() ו-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)
כדי לראות את דוגמת הקוד המלאה ל-Python 3 (Flask), אפשר לעיין ב-GitHub.
דוגמה: אפליקציית WSGI ללא מסגרת אינטרנט
בדוגמת הקוד הבאה ב-Python 3 (אפליקציית WSGI) אפשר לראות איך מוסיפים את הפרמטר environ כשמשתמשים במחלקות של Blobstore handler באפליקציית WSGI ללא framework אינטרנטי.
שימו לב איך הפרמטר 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.