我正试图将一个应用程序从谷歌应用程序引擎标准环境第一代(python 2.7运行时(迁移到第二代(python 3运行时(。
该应用程序为存储在谷歌云存储(以前的blob存储(中的用户特定图像提供服务。我已经完成了谷歌提供的迁移指南中提到的大部分迁移。
我面临以下挑战:
- 我找不到任何为存储在谷歌云存储中的Blob创建
blob key
的特定方法。在上一代中,我可以使用create_gs_key
,但该功能似乎已被删除 - 旧的应用程序以
ndb.BlobKeyProperty()
的形式存储了图像详细信息,我如何将这些信息迁移到云存储并保留信息。对于上一代,我可以使用GoogleAppEngineCloudStorageClient
库
当前堆栈:
- 谷歌应用程序引擎:python 3运行时,flask HTML,jquery,javascript
旧堆栈:
- 谷歌应用引擎:python 2.7运行时,webapp2,HTML,jquery,javascript
免责声明:
- Google通过在app.yaml中启用
appengine apis
,确实提供了在python 3运行时使用应用程序引擎API的选项,但似乎该功能随时都可能被删除 - 我不想使用docker将应用程序永久保存在python 2.7上
- 除了
images API
,我没有使用任何其他遗留的谷歌应用程序引擎服务
我可能错过了什么,所以请随时更正。
编辑1:
-
如前所述,我有一个旧的应用程序,它的
blob_key
指示存储图像的blob密钥,如果在当前版本中我必须直接使用file name
,我将不得不将以blob密钥形式存储的图像迁移到谷歌云存储,或者对模型进行更改(我正在努力避免这种情况,除非我没有任何其他选择( -
如果我理解正确,
google.appengine.api.blobstore.blobstore
将被弃用,并且不鼓励使用blob store
方法(如果我错了,请纠正我(。
我也遇到过几乎相同的问题:我的GAE应用程序是用python2.7和API编写的,这一点不推荐使用。我所做的是用python3和Flask创建了一个全新的应用程序,并为其提供了公共api端点api.{{my domain}}.com
。当收到对物品图像的请求时,我会调用我的应用程序的旧版本python2.7,并将其写回新版本。它并不优雅,但它是我能做的最好的。
item = get_item(item_id)
q = Image.query()
data = q.filter(Image.reference == item.key)
data = data.fetch(5)
for i in data:
# get the image from legacy and write it to new
x_list = reqs.get(f"https://legacy.myapp.com/imgs/{item_id}").content
l_json = json.loads(x_list)
item.images = []
for img_url in l_json.get("imgs"):
img_data = reqs.get(img_url).content
identity = str(uuid.uuid4())
try:
io_img_data = io.BytesIO(img_data)
upload_blob("mynew_app.appspot.com", io_img_data, identity)