Python Google API存储返回字符串,而不是凭据对象
我正在尝试使用用于python的GoogleAPI。 我已设法将凭据存储在Python Google API存储返回字符串,而不是凭据对象,python,django,google-api,gmail-api,Python,Django,Google Api,Gmail Api,我正在尝试使用用于python的GoogleAPI。 我已设法将凭据存储在CredentialsField(基本上是复制)实现中 我可以获得一个存储对象: >>> storage = Storage(CredentialsModel, 'id', user, 'credential') >>> storage <oauth2client.django_orm.Storage object at 0x7f1f8f1260f0> 我只得到一个大
CredentialsField
(基本上是复制)实现中
我可以获得一个存储对象:
>>> storage = Storage(CredentialsModel, 'id', user, 'credential')
>>> storage
<oauth2client.django_orm.Storage object at 0x7f1f8f1260f0>
我只得到一个大字符串(7482个字符),而不是凭证对象。有什么好处?(我认为字符串可能是bytearray,因为它以开头\\x67414e6a6
我也在使用Python3
有没有想过为什么我得到的是字符串而不是凭证对象?如果您仍然需要,我已经找到了答案: 问题是django_orm中的类CredentialFields定义了一个元类变量,python3不再支持该变量 因此,有必要将其更改为以下内容: class CredentialsField(models.Field,元类=models.SubfieldBase): 有人在github回购协议中提出了一个问题:
我的python3、django 1.8和postgres数据库解决方案: 在将字节数据保存到数据库之前和从数据库检索数据之后,缺少一个步骤:字节数据需要首先转换为字符串或从字符串转换为字符串。您可以使用
decode(“utf-8”)
和encode(“utf-8”)
将字节转换为字符串,反之亦然
您也不需要\uuuuuuuuuuuuuuuuuuuuuuu元类
,但需要使用获取\u prep\u value()
和from\u db\u value()
函数。
整个类CredentialsField
应重写如下:
class CredentialsField(models.Field):
def __init__(self, *args, **kwargs):
if 'null' not in kwargs:
kwargs['null'] = True
super().__init__(*args, **kwargs)
def get_internal_type(self):
return "TextField"
def to_python(self, value):
if value is None:
return None
if isinstance(value, oauth2client.client.Credentials):
return value
value = value.encode("utf-8") # string to byte
return pickle.loads(base64.b64decode(value))
def from_db_value(self, value, expression, connection, context):
return self.to_python(value)
def get_db_prep_value(self, value, connection, prepared=False):
if value is None:
return None
byte_repr = base64.b64encode(pickle.dumps(value))
return byte_repr.decode("utf-8") # byte to string
def get_prep_value(self, value):
return self.get_db_prep_value(value)
我认为它与credential对象有关。它在credential引用中有一些随机值。尝试在credential类中包含一些getter和setter,这将帮助您打印credential类。
class CredentialsField(models.Field):
def __init__(self, *args, **kwargs):
if 'null' not in kwargs:
kwargs['null'] = True
super().__init__(*args, **kwargs)
def get_internal_type(self):
return "TextField"
def to_python(self, value):
if value is None:
return None
if isinstance(value, oauth2client.client.Credentials):
return value
value = value.encode("utf-8") # string to byte
return pickle.loads(base64.b64decode(value))
def from_db_value(self, value, expression, connection, context):
return self.to_python(value)
def get_db_prep_value(self, value, connection, prepared=False):
if value is None:
return None
byte_repr = base64.b64encode(pickle.dumps(value))
return byte_repr.decode("utf-8") # byte to string
def get_prep_value(self, value):
return self.get_db_prep_value(value)