使用带有dev_appserver的{google cloud数据存储模拟器

时间:2016-07-26 09:08:59

标签: python google-app-engine google-cloud-platform google-cloud-datastore

我一直在阅读这些内容,并试图将dev_appserver.py与新的“非遗留”谷歌云数据存储模拟器进行交互。

我的主要动机是在我在本地计算机上进行开发时,将我的appengine项目与我的Google云数据流管道集成。

据我所知,这是设置集成的过程:

  • 使用pip安装googledatastore库(如果您使用的是系统python El Capitan,则可能需要使用easy_install强制升级six
  • 使用google cloud sdk工具运行google云数据存储模拟器:

    gcloud beta emulators datastore start --no-legacy
    
  • 在dev_appserver将运行以下命令以设置数据存储环境变量的终端中:

    $(gcloud beta emulators datastore env-init --no-legacy)
    
  • 如果app.yaml中的项目ID与gcloud工具中当前选择的项目ID不匹配,请在同一个shell中设置以下环境变量:

    export DATASTORE_USE_PROJECT_ID_AS_APP_ID=true
    
  • 运行dev_appserver.py并导航到http://localhost:8000/datastore,这样可以导航模拟器的数据存储数据。

然而,当我导航到我得到的网址时,这不会那么顺利:

BadArgumentError: Could not import googledatastore.
This library must be installed with version >= 4.0.0.b1 to use the Cloud Datastore 
API.

这很奇怪,因为如果我打开一个python shell并运行import googledatastore则不会发生错误。

如果我深入挖掘并检测dev_appserver中的导入代码并记录错误here,我会得到以下回溯:

Traceback (most recent call last):
  File "/usr/local/google-cloud-sdk/platform/google_appengine/google/appengine/datastore/datastore_pbs.py", line 52, in <module>
    import googledatastore
  File "/Library/Python/2.7/site-packages/googledatastore/__init__.py", line 21, in <module>
    from . import helper
  File "/Library/Python/2.7/site-packages/googledatastore/helper.py", line 25, in <module>
    from google.datastore.v1beta3 import entity_pb2
ImportError: No module named datastore.v1beta3 

我也没有在常规python shell中导入google.datastore.v1beta3的问题。

如果我运行PYTHONINSPECT=x dev_appserver.py app.yaml并退出执行这些导入的shell运行没有错误,那就更奇怪了。也许在dev_appserver.py启动时,python路径会发生奇怪的事情?

有人能告诉我如何使这项功能正常运作吗?

更新:我在ubuntu 14.04(系统python 2.7.6,pip 8.1.2,通过easy_install,gcloud-sdk 118.0.0,app-engine-python 1.9.38)以及OS X(gcloud sdk)上重现了这个问题114.0.0,app-engine-python 1.9.38,system python 2.7.10)。

3 个答案:

答案 0 :(得分:3)

我们最近遇到了同样的问题。要注意的一件事是命令的输出:

(gcloud beta emulators datastore env-init --no-legacy)

我们遇到的问题是,当我们运行模拟器时,模拟器选择了端口8607,但是env-init方法返回了另一个端口8328.

所以,我建议的是启动模拟器并查看它运行的端口:

[datastore] Aug 04, 2016 3:50:50 PM com.google.appengine.tools.development.AbstractModule startup
[datastore] INFO: Module instance default is running at http://localhost:8607/
[datastore] Aug 04, 2016 3:50:50 PM com.google.appengine.tools.development.AbstractModule startup
[datastore] INFO: The admin console is running at http://localhost:8607/_ah/admin

在本例中为8607,然后触发env-init方法以获取语法但验证端口。在我们的情况下运行env-init的上述服务器返回8328

$ (gcloud beta emulators datastore env-init)
export DATASTORE_DATASET=my-app
export DATASTORE_EMULATOR_HOST_PATH=localhost:8328/datastore
export DATASTORE_EMULATOR_HOST=localhost:8328
export DATASTORE_HOST=http://localhost:8328
export DATASTORE_PROJECT_ID=my-app

所以将其更改为正确的端口:

export DATASTORE_DATASET=my-app
export DATASTORE_EMULATOR_HOST_PATH=localhost:8607/datastore
export DATASTORE_EMULATOR_HOST=localhost:8607
export DATASTORE_HOST=http://localhost:8607
export DATASTORE_PROJECT_ID=my-app

然后在你的项目运行的地方使用它,你应该很高兴。这就是为我们解决的问题。希望有所帮助!

答案 1 :(得分:2)

实际上,gcloud数据存储模拟器和dev_appserver指向两个不同的端点。 localhost:8000是默认的dev_appserver管理控制台,而数据存储模拟器有一个不同的控制台URL,可以在启动时在打印输出中找到。

我假设您正在访问的管理控制台属于dev_appserver,那么问题应该在dev_appserver中。你能在dev_appserver中使用数据存储api附加代码片段(如果有的话)吗?顺便说一句,它应该是gcloud.datastore而不是appengine.ext.(n)db与gcloud数据存储模拟器交谈。

另外,我很好奇如果你不使用'--no-legacy'启动数据存储模拟器会发生什么,或者甚至不启动数据存储模拟器但只启动dev_appserver?

答案 2 :(得分:1)

抬起头来,

现在可以使用带有dev_appserver的Google云数据存储模拟器! (link

更新Google Cloud SDK,然后使用'---- support_datastore_emulator'运行dev_appserver。

此功能处于测试版,欢迎试用!我们正在积极收集反馈意见。