1

Google Cloud Endpoints를 사용하여 API를 관리하고 있으며 이상한 오류가 발생하여 고생하고 있습니다. 오류는 프로덕션에서만 발생하며 단위 테스트는 특성을 전달합니다.GAE 끝점 오류 : FooBar이 (가) 있습니다. FooBar()가 있습니다.

class UserFacebookData(ndb.Model): 
    facebook_id = ndb.StringProperty(required=True, indexed=True) 
    facebook_token = ndb.StringProperty(required=True, indexed=True) 

class User(ndb.Model, Entity): 
    created = ndb.DateTimeProperty(auto_now_add=True, indexed=True) 
    username = ndb.StringProperty(indexed=True) 
    facebook_data = ndb.StructuredProperty(UserFacebookData, indexed=False) 

그리고 사용자

ufd = UserFacebookData(facebook_id=some_api_data, facebook_token=some_api_data) 
user = User(username=some_api_data, facebook_data=ufd) 
user.save() 
또는 하나

ufd = UserFacebookData(facebook_id=some_api_data, facebook_token=some_api_data)  
user = get_from_db(some_api_data) 
user.facebook_data = ufd 
user.save() 

(편집 업데이트 만들려면이를 사용하여 : (저장)를입니다

나는 다음과 같은 모델을 가지고 부모 Entity 클래스의 메서드, put() + 일부 memcached 작업 수행)

그리고,

Expected UserFacebookData instance, 
got UserFacebookData(facebook_id=u'xxx', facebook_token=xxx')) 

그러나 흔적 사용자, 다음과 같은 오류를 업데이트 (인쇄 할을하고 UFD/UserFacebookData 인스턴스의 유형을 확인)이 제대로 만들어지는 것을 보여 주었다 사용자 또한 때 때때로 도착 존재하지 않습니다.

# print user.username 
my_username 
# print UserFacebookData 
UserFacebookData(facebook_id=u'xx', facebook_token=xx') 
# print type(UserFacebookData) 
UserFacebookData<facebook_id=StringProperty('facebook_id', required=True), 
facebook_token=StringProperty('facebook_token', required=True)> 

제가 누락 된 부분을 볼 수 없습니다. 누군가가 이미 그것을 경험 했습니까? 다음은 전체 오류 스택입니다.

Encountered unexpected error from ProtoRPC method implementation: BadValueError (Expected UserFacebookData instance, got UserFacebookData(facebook_id=u'xx', facebook_token=xx')) 
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 1329, 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~yapme-web/alpha2.377359917212322950/api/helpers.py", line 43, in method 
return func(*args, **kwargs) 
    File "/base/data/home/apps/s~xx-web/alpha2.377359917212322950/api/user.py", line 25, in users_create 
user = User.create(request) 
    File "/base/data/home/apps/s~xx-web/alpha2.377359917212322950/entities/users.py", line 168, in create 
user.facebook_data = facebook_data 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1339, in __set__ 
    self._set_value(entity, value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1084, in _set_value 
value = self._do_validate(value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1031, in _do_validate 
value = self._call_shallow_validation(value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1223, in _call_shallow_validation 
return call(value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1270, in call 
newvalue = method(self, value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 2269, in _validate 
(self._modelclass.__name__, value)) 
BadValueError: Expected UserFacebookData instance, got UserFacebookData(facebook_id=u'xx', facebook_token=xx') 

답변

0

save()은 ndb 구문이 아닙니다. 나는 당신이 put()을 원한다고 생각한다. 사용자를 업데이트하려면

ufd = {"facebook_id":some_api_data, "facebook_token":some_api_data} 
user = User(username=some_api_data, facebook_data=ufd) 
user.put() 

: 사용자를 만들려면

: 또한, 당신은 단지 StructuredProperty 값을 설정하는 딕셔너리를 사용할 수 있어야

ufd = {"facebook_id":some_api_data, "facebook_token":some_api_data} 
user = get_from_db(some_api_data) 
user.facebook_data = ufd 
user.put() 

이에 당신을 허용해야 동시에 둘 다 저장하십시오. 그렇지 않으면 궁극적 인 일관성 문제가 발생할 수 있습니다. 이는 생산 과정에서 간헐적으로 만 발생한다고 말하는 것처럼 문제가 될 가능성이 큽니다.

+0

그러나 사용자를 만들 때 UserFacebookData 개체가 저장되지 않습니다. – apassant

+0

put()을 사용했지만 여전히 오류가 있습니다 – apassant

+0

편집을 참조하십시오. 'put() '으로 코드보기 – GAEfan