App Engine在模块间读取DataStore数据

5 投票
3 回答
762 浏览
提问于 2025-04-28 01:09

我有一个应用程序,分成了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

根据谷歌云支持的这个回答,有三种方法可以共享代码。

  1. 使用符号链接指向一个包含定义的单一文件……但在不同操作系统上使用时可能会遇到麻烦。根据这个StackOverflow的回答,GAE会将一个目录的内容复制到目标目录。
  2. 编写一个构建脚本,将模型定义复制到每个服务。
  3. 手动将模型定义复制到每个服务。
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

撰写回答