【问题标题】:dev_appserver wont use my index.yaml python3.7dev_appserver 不会使用我的 index.yaml python3.7
【发布时间】:2020-10-09 11:28:20
【问题描述】:

我正在将 python2.7 gae std 应用程序升级到 python3.7。 一切都很好,只是我的索引不起作用。

我有一个简单的 index.yaml 文件:

indexes:

- kind: Response
  ancestor: yes
  properties:
  - name: __key__
    direction: desc

当我运行某些命令时,我得到了这个

google.api_core.exceptions.FailedPrecondition: 400 no matching index found. recommended index is:
- kind: Response
  ancestor: yes
  properties:
  - name: __key__
    direction: desc

我用来运行 dev_appserver 的命令是:dev_appserver.py --application=my_project_id app.yaml。 我的 index.yaml 文件与我的 app.yaml 文件位于同一目录中。

没有其他东西在运行。应用程序本身是一个 Flask api,当我 curl 其中一个端点时出现错误。

我的尝试

在浏览了一些文档和 SO 之后,似乎我可能需要在本地运行数据存储模拟器。所以请确保我的 gcloud 组件是最新的:

gcloud beta emulators datastore env-init

# which gave me:

export DATASTORE_DATASET=firestore-datastore-280307
export DATASTORE_EMULATOR_HOST=::1:8608
export DATASTORE_EMULATOR_HOST_PATH=::1:8608/datastore
export DATASTORE_HOST=http://::1:8608
export DATASTORE_PROJECT_ID=firestore-datastore-280307

# then

gcloud beta emulators datastore start --project=my_project_id

# which gave me 

stuff...

[datastore] API endpoint: http://::1:8679
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore] 
[datastore]   export DATASTORE_EMULATOR_HOST=::1:8679
[datastore] 
[datastore] Dev App Server is now running.

所以通过组合这些输出,我的环境看起来应该是这样的:

export DATASTORE_DATASET=my_project_id
export DATASTORE_EMULATOR_HOST=::1:8679
export DATASTORE_EMULATOR_HOST_PATH=::1:8679/datastore
export DATASTORE_HOST=http://::1:8679
export DATASTORE_PROJECT_ID=my_project_id

酷。所以我让模拟器运行并尝试让我的 dev_appserver 连接到它:

export DATASTORE_DATASET=my_project_id
export DATASTORE_EMULATOR_HOST=::1:8679
export DATASTORE_EMULATOR_HOST_PATH=::1:8679/datastore
export DATASTORE_HOST=http://::1:8679
export DATASTORE_PROJECT_ID=my_project_id
dev_appserver.py --application=my_project_id app.yaml

它启动了,但是当我 curl 我的端点时,我得到了相同的索引错误。

然后我杀死 dev_appserver 并像这样尝试:

# same env vars as before
dev_appserver.py --support_datastore_emulator=true --application=my_project_id app.yaml

然后我得到一个新的错误:

RuntimeError: Cannot use the Cloud Datastore Emulator because the packaged grpcio is incompatible to this system. Please install grpcio using pip

我在 python2.7 环境中 pip 安装了 grpcio 以克服该错误。现在看起来一切都在运行。但我仍然收到缺少索引的错误。

还有一件奇怪的事情:如果我转到 http://localhost:8000 并尝试导航到与数据存储有关的任何内容,那么我会收到如下错误:

ConnectionError: Cannot connect to Cloud Datastore Emulator on ::1:{THE_PORT}

这很奇怪。

我正在考虑回到 2.7。

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore python-3.7 app-engine-ndb


    【解决方案1】:

    不要回到 2.7!如果您在生产中遇到此问题,请转到您的开发人员控制台并检查您的索引:https://console.cloud.google.com/....。 看看他们是否还在建造。建立索引确实需要一些时间。

    如果这只发生在开发中:

    dev_appserver 在 Windows 中存在问题。我不知道你是否在 Windows 上。在将应用程序移植到 Python 3.7 时,即使在 Mac 上,我也遇到了在虚拟环境中使用 dev_appserver 的问题。

    您声明您正在使用 Flask。尝试在开发中使用 Flask 服务器而不是 dev_appserver。这对我有用。这方面有很好的文档。您将从以下内容开始:

    cd /Users/myname/venv37
    source ./bin/activate
    export FLASK_APP=/Users/myname/path_to_app
    FLASK_ENV=development flask run --port 5000
    

    编辑:

    ndb 与 python 3.7 不兼容。他们开发了一项新服务 Google Cloud NDB,使旧的 ndb 数据可用:https://cloud.google.com/appengine/docs/standard/python3/migrating-to-cloud-ndb

    新应用应使用 Cloud Datastore 或 Firestore。但旧版ndb 应用可以迁移到 Google Cloud NDB。

    【讨论】:

    • 你让我找到了正确的解决方案......基本上数据存储模拟器要么损坏,要么与 py3.7 上的 ndb 不兼容。所以我必须使用一个实际的基于云的数据存储来进行开发。如果你愿意,你可以编辑你的答案,然后我会接受它
    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2011-03-06
    • 2017-03-19
    • 2020-10-12
    相关资源
    最近更新 更多