App Engine在模块间读取DataStore数据
我有一个应用程序,分成了5个模块(看看我美丽的ASCII艺术)。每个模块都有自己的目录,就像这个结构一样。
AppEngine App <--Here's the dispatch.yaml
---------------------
| | | | |
| | | | |
Mod1 Mod2 Mod3 Mod4 Mod5
^ ^
\__Here's the models |__ Here i wanna read the models
.py file
with the __init__.py
NDB模型是在一个模块中定义的(比如mod1),我想在Mod5中读取一些数据,官方文档说这是可能的,但我做不到。我是这样导入模型的:
#this is in mod5 py file
import Mod1.models # No module named Mod1.models
from Path.Mod1 import models #No module named Path.Mod1
from Mod1 import models #No module named Mod1
from Mod1.models import specific_model #No module named Mod1.models
from Path.models import specific_model #No module named Path.models
我把每个模块的--storage_path设置都改了,这样才能在启动器中同时运行所有模块,我觉得这可能是问题所在。但是如果我把目录保持一致,怎么才能同时运行所有模块呢?我遇到了“OperationalError: database is locked”的错误。
3 个回答
1
根据你提供的信息,我在想你是不是在每个子目录里缺少了一个叫 __init__.py
的文件。这个文件可以让Python模块在这些目录中被使用。你可以查看这个链接了解更多信息:https://docs.python.org/2/tutorial/modules.html#packages
你能分享一下这些目录里的文件结构吗?
3
根据谷歌云支持的这个回答,有三种方法可以共享代码。
- 使用符号链接指向一个包含定义的单一文件……但在不同操作系统上使用时可能会遇到麻烦。根据这个StackOverflow的回答,GAE会将一个目录的内容复制到目标目录。
- 编写一个构建脚本,将模型定义复制到每个服务。
- 手动将模型定义复制到每个服务。
1
我找到了一种方法,虽然不是最理想的,但能用。
如果我把 Mod5 文件夹里的 models.py 文件复制一份,然后去掉 --storage_path 的设置(因为数据库在开发服务器的同一个临时文件夹里共享),我就能读取存储的数据。
显然,每次修改模型的时候都需要同步,但至少我可以继续我的代码工作。
目录结构保持如下:
-- Main (with the dispatch.yaml)
|__ Mod1
| |__ model.py
| |__ app.yaml
| |__ specificMod1Code.py
| |______ Templates
| |______ js
| |______ css
| |______ img
:
:
:
|__ Mod5
|__ model.py #equal that mod1
|__ app.yaml #with the mod5 instace and stuff
|__ specificMod5Code.py
|______ Templates
|______ js
|______ css
|______ img
要同时运行所有模块,需要在应用的根目录下运行 dev_appserver 命令(来源)
python dev_appserver.py mod1\app.yaml mod2\app.yaml mod3\app.yaml mod4\app.yaml mod5\app.yaml
在以下网址运行:
Mod1=> localhost:8080
Mod2=> localhost:8081
Mod3=> localhost:8082
Mod4=> localhost:8083
Mod5=> localhost:8084