我正在代表注册用户编写一个离线访问 Google API 的应用程序。注册过程会收集基本帐户信息,例如公司名称、联系 Eamil 等。然后引导用户完成 OAuth2 过程,最终获得用户的 OAuth2 凭据。我想将所有这些数据、企业名称、联系人电子邮件和 OAuth2 凭据保存在同一个数据存储实体中。但是,当我尝试调用 Model.put(); 时,我遇到了这个奇怪的错误。
BadValueError:属性凭据必须可转换为凭据实例(<oauth2client.client.OAuth2Credentials 对象位于 0xb595facc>)
我的 Oauth 回调函数如下所示。您可以看到我尝试过使用 StorageByKeyName() 但它给出了同样的错误。
注意我不确定这是否重要,但在我调用 ua.put() 时,实体尚未创建。我已经看到了其他非常相似的代码,其中在分配凭证属性时实体已经存在。
class Oauth2callback(BaseHandler):
def get(self):
user = users.get_current_user()
flow = pickle.loads(memcache.get( user.user_id() ))
if flow:
# Store UserAccount
credentials = flow.step2_exchange(self.request.params)
pa = models.ParentAccount.get_account_by_token('XXXXXXXXXX')
ua = models.UserAccount(
key_name = user.user_id(),
account_email = user.email(),
parent_account = pa,
credentials = credentials,
)
ua.put()
# Try Storing Credentials Separately
# credentials = flow.step2_exchange(self.request.params)
# storage = StorageByKeyName(models.UserAccountCredentials, user.user_id(), 'credentials')
# storage.put(credentials)
谢谢
这是模型定义。
class UserAccount(db.Model):
status_states = ["IN-ACTIVE","ACTIVE", "PAUSED", "DELETED"]
account_email = db.StringProperty(required=False)
contact_email = db.StringProperty(required=False)
business_name = db.StringProperty(required=False)
create_date = db.DateTimeProperty(auto_now_add=True)
account_settings = db.StringProperty(required=False) # JSON config data MAX 500 characters. Change type: 'Text' for larger values and to avoid indexing.
parent_account = db.ReferenceProperty(ParentAccount, collection_name = "children", required=False)
status = db.StringProperty(required=True, default = "ACTIVE", choices=set(status_states))
original_status = db.StringProperty(required=True, default = "ACTIVE", choices=set(status_states))
credentials = CredentialsProperty(required=False)