如何在Google App Engine中正确实现多个模块的多个版本?
我一直在尝试创建一个包含多个模块的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 个回答
也许你在 appengine_config.py
这个文件里做的事情有点多,试着把它简化成:
import sys
sys.path.insert(0, 'lib')
注意: 开发服务器不允许你加载同一个模块的不同版本。
你需要把模块的定义放在顶层目录,这样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