2015-01-04 5 views
0

У меня возникли проблемы с получением правильного ответа на запрос Python в Google App Engine.Запрос API Python в хранилище данных Google App Engine

Здесь находится LOG из GAE, он успешно распечатывает объект, соответствующий параметрам запроса, но теперь я пытаюсь отправить эти данные объектов в JSON обратно. Я создаю рудиментарную систему auth пользователя, которая запрашивает объект USER с использованием электронной почты и пароля, и если он существует, чем он возвращает все данные обратно.

Как я могу разбить этот запрос, чтобы вернуть найденные данные?

E 00:21:06.352 Encountered unexpected error from ProtoRPC method implementation: AttributeError ('list' object has no attribute 'email') 
    Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/protorpc-1.0/protorpc/wsgi/service.py", line 181, in protorpc_service_app 
     response = method(instance, request) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/endpoints-1.0/endpoints/api_config.py", line 1332, in invoke_remote 
     return remote_method(service_instance, request) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/protorpc-1.0/protorpc/remote.py", line 412, in invoke_remote_method 
     response = method(service_instance, request) 
    File "/base/data/home/apps/s~caramel-theory-800/1.381271940209425490/photoswap_api.py", line 34, in user_auth 
     return UserCreateResponseMessage(email=query.email, password=query.password, username=query.username, 
    AttributeError: 'list' object has no attribute 'email' 
E 00:21:06.360 [User(key=Key('User', 5086441721823232), email=u'pop', password=u'top', username=u'yop')] 

Вот ENDPOINT API

Я считаю, что вопрос находится в последней строке кода, где он TRYS возвращать результаты запроса (UserAuthResponseMessage) ..

@endpoints.method(UserAuthRequestMessage, UserAuthResponseMessage, 
        path='user', http_method='GET', 
        name='user.auth') 
def user_auth(self, request): 
    # create some type of query to check for email address, and than check to see if passwords match 
    query = User.query(User.email == request.email, User.password == request.password).fetch() 
    print query 

    # return the info from the server 
    return UserCreateResponseMessage(email=query[0].email, password=query[0].password, username=query[0].username, 
            id=query[0].key.id()) 


APPLICATION = endpoints.api_server([PhotoswapAPI], restricted=False) 

ответ

1

Проблема заключается в том, что вы выполняете запрос и ожидаете ссылки на свойство email запроса, которое, конечно же, не имеет его.

Если вы ожидаете только одного результата запроса, вы должны использовать get, а не индексную адресацию.

Другая проблема заключается в том, что включенный метод user_auth не соответствует вашей трассировке стека. Так что проблема здесь.

0

С помощью Тима Хоффмана это решение, с которым я смог придумать.

Я возвращал неправильный ответ ResponseMessage, и мне было лучше использовать .get вместо .fetch, так как должен быть возвращен только один результат.

@endpoints.api(name='photoswap', version='v1') 
class PhotoswapAPI(remote.Service): 
    @endpoints.method(UserCreateRequestMessage, UserCreateResponseMessage, 
         path='user', http_method='POST', 
         name='user.create') 
    def user_create(self, request): 
     entity = User(email=request.email, password=request.password, username=request.username) 
     entity.put() 
     return UserCreateResponseMessage(email=entity.email, password=entity.password, username=entity.username, 
             id=entity.key.id()) 

    @endpoints.method(UserAuthRequestMessage, UserAuthResponseMessage, 
         path='user', http_method='GET', 
         name='user.auth') 
    def user_auth(self, request): 
     # create some type of query to check for email address, and than check to see if passwords match 
     query = User.query(User.email == request.email, User.password == request.password).get() 
     print query 

     # return the info from the server 
     return UserAuthResponseMessage(email=query.email, password=query.password, username=query.username, id=query.key.id()) 


APPLICATION = endpoints.api_server([PhotoswapAPI], restricted=False) 
+0

Код в этом «ответе» по-прежнему не прав, отредактируйте и исправьте его в соответствии с предшествующим ему текстом. –

+0

Я не совсем уверен, что это такое. Я использовал .get(), который возвращает 1 результат, и я могу ссылаться на адрес электронной почты, пароль, имя пользователя и значение id из запроса. Возвращаемый JSON - это то, что я искал в ответном сообщении. Не могли бы вы рассказать о том, что это «неправильно»? –

Смежные вопросы