Python Google API存储返回字符串,而不是凭据对象

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> 我只得到一个大

我正在尝试使用用于python的GoogleAPI。 我已设法将凭据存储在
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)