4

我有一个应用程序分为 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:数据库已锁定”错误)这里有什么线索吗?

4

3 回答 3

2

根据谷歌云支持的这个答案,有3种方法。

  1. 指向具有定义的单个文件的符号链接......当使用不同的操作系统时,这可能会变得很棘手。根据Dan 评论中链接的这个 SO 答案,GAE 将目录的内容复制到目标目录。
  2. 编写构建脚本以将模型定义复制到每个服务。
  3. 手动将模型定义复制到每个服务。
于 2016-10-15T16:54:07.100 回答
1

根据给定的信息,我想知道您是否缺少__init__.py每个子目录中的文件。这将允许 Python 模块在这些目录中可用。请参阅https://docs.python.org/2/tutorial/modules.html#packages

您可以共享目录中的文件结构吗?

于 2014-10-17T03:03:32.517 回答
1

我找到了一个不理想的答案,但有效。

如果我克隆(AKA 复制粘贴)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

要同时运行所有模块,需要在应用程序的根目录( source)中运行 dev_appserver 命令

python dev_appserver.py mod1\app.yaml mod2\app.yaml mod3\app.yaml mod4\app.yaml mod5\app.yaml

在此 URL 中运行

Mod1=> 本地主机:8080

Mod2=> 本地主机:8081

Mod3=> 本地主机:8082

Mod4=> 本地主机:8083

Mod5=> 本地主机:8084

于 2014-10-17T16:57:50.873 回答