我有一个分为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:数据库被锁定"错误)这里有线索吗?
根据谷歌云支持的答案,有三种方法。
- 指向具有定义的单个文件的符号链接。。。当使用不同的操作系统时,这可能会变得棘手。根据Dan评论中链接的SO回答,GAE将目录的内容复制到目标目录
- 编写一个构建脚本,将模型定义复制到每个服务
- 手动将模型定义复制到每个服务
根据给定的信息,我想知道您是否在每个子目录中都缺少__init__.py
文件。这将允许Python模块在这些目录中可用。看见https://docs.python.org/2/tutorial/modules.html#packages
你能共享目录中的文件结构吗?
我找到了一个答案,虽然不理想,但有效。
如果我克隆(A.K.A复制粘贴)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 mod1app.yaml mod2app.yaml mod3app.yaml mod4app.yaml mod5app.yaml
在此URL的中运行
Mod1=>localhost:8080
Mod2=>localhost:8081
Mod3=>localhost:8082
Mod4=>localhost:8083
Mod5=>localhost:8084