如何在Google App Engine中正确实现多个模块的多个版本?

5 投票
2 回答
690 浏览
提问于 2025-04-18 10:42

我一直在尝试创建一个包含多个模块的Google App Engine项目,每个模块还有不同的版本,但我就是搞不定。

我查看了谷歌模块指南网站上的所有内容,但他们对应用程序结构的描述非常模糊。我下载了一个简单的测试应用程序想看看它是怎么工作的(结果我也没能让它运行起来)。

现在这个应用的结构是这样的:
http://www.iteratorium.eu/stackoverflow/structure.jpg

整个项目压缩包在这里:
http://www.iteratorium.eu/stackoverflow/flask_app.zip

这个项目有三个模块:default、my-module和mobile-frontend,而my-module和mobile-frontend各自有两个版本,分别放在v_one和v_two文件夹里。每个版本都有自己的.yaml文件,里面只定义了一个处理程序(为了测试简单点)。

这个结构至少是正确的吗?当我通过dev_appserver.py文件加载应用时,只要不加载同一个模块的两个版本,一切都正常。但如果加载两个版本,就会出现这样的情况:

me@MY_COMPUTER:~/flask_app$ python ~/google_appengine/dev_appserver.py dispatch.yaml app.yaml mobile-frontend/v_one/mobile-frontend.yaml my-module/v_one/my-module.yaml my-module/v_two/my-module.yaml

结果是出现了错误追踪和以下信息:

google.appengine.tools.devappserver2.errors.InvalidAppConfigError: Duplicate module: my-module

(两个版本都通过appcfg.py上传到appengine时没有任何错误,可能只是本地服务器无法处理多个版本)

如果我只加载每个模块的一个版本,一切都能正常工作,但这些模块却无法从lib目录中导入任何东西。通过浏览器访问http://localhost:8082/mobiler时,终端会显示这样的信息:

from flask import Flask
ImportError: No module named flask

我在appengine_config.py文件中定义了lib文件夹的路径,但似乎对模块没有效果。我在这里停下来了,决定来这里问问,因为我甚至不确定这个结构是否正确,可能我完全搞错了。

那么……我到底错得有多离谱呢?

2 个回答

0

也许你在 appengine_config.py 这个文件里做的事情有点多,试着把它简化成:

import sys

sys.path.insert(0, 'lib')
1

注意: 开发服务器不允许你加载同一个模块的不同版本。

你需要把模块的定义放在顶层目录,这样appengine_config.py才能被加载。

如果你真的非常想把两个版本的代码分开,下面这种组织方式会更好(这里仅展示移动前端部分以保持简洁):

root
  |__ mobile-frontend
  |   |__ v_one
  |       |__ __init__.py
  |      |__ mobiler.py
  |   |__ v_two
  |       |__ __init__.py
  |       |__ mobiler.py
  |__ appengine_config.py
  |__ dispatch.yaml
  |__ mobile_frontend_v_one.yaml
  |__ mobile_frontend_v_two.yaml

而mobile_frontend_v_one.yaml文件应该包含类似这样的内容:

handlers:
  - url: .*/mobiler
    script: mobile-frontend.v_one.mobiler.app

撰写回答