app-engine-rest-server 报错 KeyError("name %s 已被使用" % model_name)

2 投票
1 回答
539 浏览
提问于 2025-04-15 21:32

我正在玩一个叫做appengine-rest-server的项目,目的是为所有现有的模型创建REST网络服务。我遇到了一个奇怪的错误,第一次在浏览器中查询这个地址:http://localhost:8080/rest/metadata/user,它给了我一个结果:

      <xs:schema>
      −
      <xs:element name="user">
      −
      <xs:complexType>
      −
      <xs:sequence>
      <xs:element maxOccurs="1" minOccurs="0" name="key" type="xs:normalizedString"/>
      <xs:element maxOccurs="1" minOccurs="0" name="surname" type="xs:string"/>
      <xs:element maxOccurs="1" minOccurs="0" name="firstname" type="xs:string"/>
      <xs:element maxOccurs="1" minOccurs="0" name="ages" type="xs:long"/>
      <xs:element maxOccurs="1" minOccurs="0" name="sex" type="xs:boolean"/>
      <xs:element maxOccurs="1" minOccurs="0" name="updatedDate" type="xs:dateTime"/>
      <xs:element maxOccurs="1" minOccurs="0" name="createdDate" type="xs:dateTime"/>
      </xs:sequence>
      </xs:complexType>
      </xs:element>
      </xs:schema>

但是刷新页面后,就出现了这个错误:

  Traceback (most recent call last):
    File "/Users/foo/Documents/AppEngine/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3185, in _HandleRequest
      self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
    File "/Users/foo/Documents/AppEngine/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3128, in _Dispatch
      base_env_dict=env_dict)
    File "/Users/foo/Documents/AppEngine/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 515, in Dispatch
      base_env_dict=base_env_dict)
    File "/Users/foo/Documents/AppEngine/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2387, in Dispatch
      self._module_dict)
    File "/Users/foo/Documents/AppEngine/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2297, in ExecuteCGI
      reset_modules = exec_script(handler_path, cgi_path, hook)
    File "/Users/foo/Documents/AppEngine/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2195, in ExecuteOrImportScript
      script_module.main()
    File "/Users/foo/Documents/AppEngine/helloworld/main.py", line 48, in main
      rest.Dispatcher.add_models({"user": UserModel})
    File "/Users/foo/Documents/AppEngine/helloworld/rest/__init__.py", line 845, in add_models
      cls.add_model(model_name, model_type)
    File "/Users/foo/Documents/AppEngine/helloworld/rest/__init__.py", line 863, in add_model
      raise KeyError("name %s already used" % model_name)
  KeyError: 'name user already used'

有人能告诉我为什么会这样吗?重启服务器后,再次在浏览器中运行,我能得到xml结果,但刷新页面就会出错。这是appengine-rest-server应用程序的bug,还是我代码的问题?我的helloworld应用可以在这里下载。

1 个回答

3

因为你有一个 main() 函数,所以应用引擎会缓存你的模块和导入的内容。因此在同一个运行环境中,你可以多次调用 add_models()。如果你把 rest 的初始化代码放到模块级别(或者放到一个在模块初始化时只调用一次的函数里,而不是在每次调用 main() 时都调用),这样就应该能正常工作了。

撰写回答