google-app-engine - 不再能够使用 dev_appserver 管理控制台创建实体

标签 google-app-engine google-cloud-datastore

我清除了数据存储中的所有实体并清除了内存缓存,使用 API Explorer 创建了一个实体,然后尝试在本地主机上运行的数据存储控制台中创建另一个同类实体:

内部服务器错误

服务器出错或无法执行请求的操作。

Traceback (most recent call last):
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1536, in __call__
    rv = self.handle_exception(request, response, e)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/admin/admin_request_handler.py", line 97, in dispatch
    super(AdminRequestHandler, self).dispatch()
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/admin/datastore_viewer.py", line 760, in get
    count=20)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/admin/datastore_viewer.py", line 121, in _get_entities
    query = datastore.Query(kind, _namespace=namespace)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore.py", line 1361, in __init__
    datastore_errors.BadArgumentError)
  File "/home/tom/work/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore_types.py", line 181, in ValidateString
    raise exception('%s must not be empty.' % name)
BadArgumentError: kind must not be empty.

这是 gcloud 版本信息:

$ gcloud --version
Google Cloud SDK 157.0.0
app-engine-python 1.9.54
beta 2017.03.24
bq 2.0.24
core 2017.05.30
gcloud 
gsutil 4.26

有什么可能出错的提示吗?

最佳答案

我认为这是 Datastore 控制台中的错误。

我能够在我的机器上重现同样的错误。如果您查看异常中的回溯,您会看到(倒数第四个):

File "/.../google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/admin/datastore_viewer.py", line 760, in get
count=20)

如果从第 735 行查看该文件,您会看到:

def get(self, entity_key_string=None):
    super(DatastoreEditRequestHandler, self).get(entity_key_string)
    if entity_key_string:
        entity_key = datastore.Key(entity_key_string)
        entity_key_name = entity_key.name()
        entity_key_id = entity_key.id()
        namespace = entity_key.namespace()
        kind = entity_key.kind()
        entities = [datastore.Get(entity_key)]
        parent_key = entity_key.parent()
        if parent_key:
            parent_key_string = _format_datastore_key(parent_key)
        else:
            parent_key_string = None
    else:
        entity_key = None
        entity_key_string = None
        entity_key_name = None
        entity_key_id = None
        namespace = self.request.get('namespace')
        kind = self.request.get('kind')
        entities, _ = _get_entities(kind,
                                    namespace,
                                    order=None,
                                    start=0,
                                    count=20)  ### line 760 #######
        ...

在最后一行中,kind 应该是包含您正在使用的模型的模型名称的字符串。相反,如果您跟踪回溯到该函数调用,您会看到 kind 是一个空字符串。我认为此时您无能为力。我建议现在使用交互式控制台来创建/编辑您的 Datastore 实体,并且只使用查看器来查看它们。我相信 Google 会很快通过更新解决此问题。

编辑:如果您确实希望 Datastore 控制台正常工作,我实际上找到了一个 hacky 修复程序,但我仍然建议只使用交互式控制台。棘手的解决方法是您将 kind 变量手动输入到 Datastore 控制台发送的 URL 中。

当您点击“创建新实体”并收到您在问题中显示的错误时,请查看网址:

http://localhost:8000/datastore/edit?kind=&next=http%3A%2F%2Flocalhost%3A8000%2Fdatastore%3Fkind%3DUnique

您会看到 ...:8000/datastore/edit?kind=&...。就在那里,只需输入型号名称。例如,假设您的模型名称是 User:

http://localhost:8000/datastore/edit?kind=User&next=http%3A%2F%2Flocalhost%3A8000%2Fdatastore%3Fkind%3DUnique

这将我带到类 User(我的模型之一)的“创建新实体”表单,我能够使用该表单创建用户。

附言您可能还想更改该 url 末尾的模型名称(我说的是 Unique)以匹配您正在创建的类型,因为该模型名称是将在您之后显示的类型创建你的新实体。所以我创建了一个 User,但随后显示了 Unique 实体(Unique 是我的模型名称之一)。

关于google-app-engine - 不再能够使用 dev_appserver 管理控制台创建实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44427631/

相关文章:

java - 我可以使用 Gradle 强制确定类路径中依赖项的顺序吗?

java - objectify 中的复杂查询

google-app-engine - Datanucleus gae.pk-id 未在 makePersistent 上填充

python - Google App Engine 数据存储区查询返回过时数据

java - 将 JAR 添加到 eclipse 项目

python - 如何在应用程序引擎 blobstore 上加密 zip 文件

python - 将 Blobstore 移动到 GCS : Google App Engine Python

java - 在 App Engine 数据存储中设置文本数据类型的编码

python - 如何获取数据存储查询的第 n 条记录

java - Google App Engine Cloud Endpoints userId 为空