2015-01-04 3 views
0

Google App Engine에서 Python Query에 대한 올바른 응답을 얻는 데 문제가 있습니다.Google App Engine Datastore의 Python API 쿼리

여기 GAE의 LOG입니다. 쿼리 매개 변수와 일치하는 개체를 성공적으로 인쇄하지만, 이제 해당 개체 데이터를 JSON으로 다시 보내려고합니다. 나는 전자 메일과 암호를 사용하여 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')] 

은 .. 내가 문제가 쿼리 (UserAuthResponseMessage)의 결과를 반환 할려고 코드의 마지막 줄 내 생각 엔드 포인트 API

입니다

@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

당신은 쿼리를 수행하고 쿼리의 전자 메일 속성을 참조하기를 기대하면서 문제가 있습니다.

쿼리 결과가 하나뿐이라면 인덱스 주소 지정 대신 get을 사용해야합니다.

다른 문제는 포함 된 user_auth 메서드가 스택 추적과 일치하지 않는다는 것입니다. 그래서 여기에 문제가 있습니다.

0

Tim Hoffman의 도움으로이 문제를 해결할 수있었습니다.

잘못된 ResponseMessage가 반환되었습니다. 결과가 1 개만 반환되어야하므로 .fetch 대신 .get을 사용하는 것이 좋습니다.

@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

내가 무엇인지 모르겠다. 실종되었다. 나는 1 개의 결과를 반환하는 .get()을 사용했으며 쿼리에서 전자 메일, 암호, 사용자 이름 및 id 값을 참조 할 수있었습니다. 반환되는 JSON은 내가 응답 메시지에서 찾고 있던 것입니다. 그게 "틀린"것이 무엇인지 자세히 설명해 주시겠습니까? –