无法将数据插入本地Google App Engine数据存储区

Ang*_*Koh 7 google-app-engine python-2.7

我正在关注Google的Mobile Shopping Assistant示例中的示例,该示例要求我根据此链接导入数据.

我尝试了根据示例的步骤(所有示例代码都是vanilla,我没有更改任何东西,除了修复警告以使用最新的Gradle构建版本)

我相信我错过了一个未在示例中说明的重要步骤.有人可以提供一些见解我错误地做了哪些步骤?

以下是我所做的步骤

  1. 启动本地googleAppEngine应用"后端"
  2. 运行cmd"appcfg.py upload_data --config_file bulkloader.yaml --url = http:// localhost:8080/remote_api --filename places.csv --kind = Place -e myEmailAddress@gmail.com".

    该命令应该在数据存储区中插入2行(places.csv包含两个条目)

  3. 这给了我以下的读数
10:07 AM Uploading data records.

[INFO    ] Logging to bulkloader-log-20151020.100728

[INFO    ] Throttling transfers:

[INFO    ] Bandwidth: 250000 bytes/second

[INFO    ] HTTP connections: 8/second

[INFO    ] Entities inserted/fetched/modified: 20/second

[INFO    ] Batch Size: 10

Error 302: --- begin server output ---

--- end server output ---
Run Code Online (Sandbox Code Playgroud)
  1. 然后我转到" http:// localhost:8080/admin/buildsearchindex ",显示"MaintenanceTasks completed".

  2. 接下来我转到" http:// localhost:8080/_ah/admin "但它会显示

数据存储区在Empty命名空间中没有实体.您需要添加数据

以编程方式,然后您可以使用此工具来查看和编辑它.

在此输入图像描述

ste*_*ich 13

我有同样的问题,但不是本地开发人员服务器,但使用已部署的版本.在几乎疯了之后,我找到了使用appcfg上传数据的解决方法.在我的情况下,我注意到尝试以下时

输入不适合我:

gcloud auth login
appcfg.py upload_data --config_file bulkloader.yaml --url=http://<yourproject>.appspot.com/remote_api --filename places.csv --kind=Place --email=<you@gmail.com>
Run Code Online (Sandbox Code Playgroud)

输出错误:

11:10 AM Uploading data records.
[INFO    ] Logging to bulkloader-log-20160108.111007
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
Error 302: --- begin server output ---

--- end server output ---
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,我没有被要求在第二个命令期间再次验证自己,但显然,appcfg仍然无法验证我的帐户.我正在使用Win7,Python 2.7,Python Google App Engine SDK,包括来自Google Cloud SDK的appcfg.py和gcloud,如果我做对了的话.

但是,在https://cloud.google.com/container-registry/docs/auth上显示您可以使用gcloud命令打印出访问令牌,然后将其手动插入适用于我的appcfg命令中

输入为我工作:

gcloud auth login
gcloud auth print-access-token
Run Code Online (Sandbox Code Playgroud)

这会打印出可以与appcfg一起使用的访问令牌

appcfg.py upload_data --oauth2_access_token=<oauth2_access_token> --config_file bulkloader.yaml --url=http://<yourproject>.appspot.com/remote_api --filename places.csv --kind=Place --email=<you@gmail.com>
Run Code Online (Sandbox Code Playgroud)

成功上传数据的输出:

10:42 AM Uploading data records.
[INFO    ] Logging to bulkloader-log-20160108.104246
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
[INFO    ] Opening database: bulkloader-progress-20160108.104246.sql3
[INFO    ] Connecting to <yourproject>.appspot.com/remote_api
[INFO    ] Starting import; maximum 10 entities per post
.
[INFO    ] 3 entities total, 0 previously transferred
[INFO    ] 3 entities (4099 bytes) transferred in 1.7 seconds
[INFO    ] All entities successfully transferred
Run Code Online (Sandbox Code Playgroud)

我希望这有助于任何人试图解决这个问题.对我来说,目前尚不清楚这个问题的根源是什么,但这是一个适合我的解决方法.

顺便说一下,我在mac上观察到同样的问题.


Ada*_*dam 4

这是我通过测试发现的。我最初执行了相同的步骤并得到了相同的错误,但输出中值得注意的是条目INFO client.py:669 access_token is expired:

MobileAssistant-Data> appcfg.py upload_data --config_file bulkloader.yaml --url=http://localhost:8080/remote_api --filename places.csv --kind=Place -e myEmailAddress@gmail.com
05:12 PM Uploading data records.
[INFO    ] Logging to bulkloader-log-20151112.171238
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
2015-11-12 17:12:38,466 INFO client.py:669 access_token is expired. Now: 2015-11-12 22:12:38.466000, token_expiry: 2015-11-06 01:33:21
Error 302: --- begin server output ---
Run Code Online (Sandbox Code Playgroud)

这看起来有点像我在开发服务器的远程 API 处理程序中看到的问题,该问题在ClientLogin 被弃用后出现(但在 Python SDK 中)。为了测试,我编辑了 build.gradle 以使用最新的 SDK 版本(从 1.9.28 到 1.9.28)并再次运行它:

MobileAssistant-Data> appcfg.py upload_data --config_file bulkloader.yaml --url=http://localhost:8080/remote_api --filename places.csv --kind=Place -e myEmailAddress@gmail.com
05:16 PM Uploading data records.
[INFO    ] Logging to bulkloader-log-20151112.171615
[INFO    ] Throttling transfers:
[INFO    ] Bandwidth: 250000 bytes/second
[INFO    ] HTTP connections: 8/second
[INFO    ] Entities inserted/fetched/modified: 20/second
[INFO    ] Batch Size: 10
2015-11-12 17:16:15,177 INFO client.py:669 access_token is expired. Now: 2015-11-12 22:16:15.177000, token_expiry: 2015-11-06 01:33:21
2015-11-12 17:16:15,565 INFO client.py:669 access_token is expired. Now: 2015-11-12 22:16:15.565000, token_expiry: 2015-11-06 01:33:21
2015-11-12 17:16:15,573 INFO client.py:571 Refreshing due to a 401 (attempt 1/2)
2015-11-12 17:16:15,575 INFO client.py:797 Refreshing access_token
2015-11-12 17:16:16,039 INFO client.py:571 Refreshing due to a 401 (attempt 2/2)
2015-11-12 17:16:16,040 INFO client.py:797 Refreshing access_token
... (ad infinitum)
Run Code Online (Sandbox Code Playgroud)

此输出现在准确反映了 Python Remote API 问题。因此,Java Remote API 似乎也存在同样的问题(身份验证检查尚未正确更新以使用新的身份验证方案)。

Python 中的解决方法是手动编辑 SDK 源代码并删除身份验证检查。我怀疑 Java SDK 也需要类似的 hack。但这并不那么简单,因为 SDK 需要从源代码重新构建。

如果我遇到其他任何问题,我会用我的发现更新这个答案。请注意,这对于已部署的应用程序应该可以完美工作- 只有开发服务器受到影响。

更新:

罪魁祸首是com/google/apphosting/utils/remoteapi/RemoteApiServlet.java中的管理员检查,与上述 Python SDK 中的问题相同。不幸的是,您无法从源代码轻松重建 SDK,因为 build.xml 中的构建目标仅包含“jsr107cache”,而构建的其余部分是通过预先生成的二进制文件完成的。看来我们只能等到未来版本中修复这个问题,但现在我将更新公共错误。

目前,我建议坚持使用文档并仅使用已部署的应用程序版本进行remote_api 上传。

  • 感谢你的努力,亚当。我可以复制,并且您的答案已在错误跟踪器上发现 -​​ https://code.google.com/p/googleappengine/issues/detail?id=12445 希望他们很快就会发布修复程序。 (2认同)