app-engine-rest-server для вызова KeyError («имя% s уже используется»% model_name) - PullRequest
2 голосов
/ 13 апреля 2010

Я играю с проектом ap pengine-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 или в моем коде? Моё приложение helloworld доступно для скачивания здесь .

1 Ответ

3 голосов
/ 13 апреля 2010

Поскольку у вас есть функция main(), App Engine кэширует ваш модуль и импортирует. Следовательно, в течение одной и той же среды выполнения вы можете вызывать add_models() более одного раза. Если вы переместите код инициализации rest на уровень модуля (или в функцию, которая вызывается один раз при инициализации модуля, а не при каждом вызове main()), он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...