サインアップしたユーザーに代わって、オフラインで Google API にアクセスするアプリケーションを作成しています。サインアップ プロセスでは、ビジネス名、連絡先 Eamil などの基本的なアカウント情報が収集されます。次に、ユーザーは OAuth2 プロセスを経て、最終的にユーザーの OAuth2 資格情報を取得します。このすべてのデータ、ビジネス名、連絡先の電子メール、および OAuth2 資格情報を同じデータストア エンティティに保存したいと考えています。ただし、Model.put(); を呼び出そうとすると、この奇妙なエラーが発生します。
BadValueError: プロパティの資格情報は Credentials インスタンスに変換できる必要があります (<oauth2client.client.OAuth2Credentials object at 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)