解码 base64 字符串 return None

Decoding base64 string return None

我尝试为用户确认电子邮件生成 uid。

'uid':urlsafe_base64_encode(force_bytes(user.pk)),

所以,效果不错,return有点像 "Tm9uZQ"

然后,当我尝试解码它时,使用 force_text(urlsafe_base64_decode(uidb64)) 它 return None.

下一个字符串

urlsafe_base64_decode(uidb64)

另外,return b'None'

我尝试 google 它,并看到了不同的实现,但复制粘贴代码不起作用。

我写的像

    b64_string = uidb64
    b64_string += "=" * ((4 - len(b64_string) % 4) % 4)
    print(b64_string)
    print(force_text(base64.urlsafe_b64decode(b64_string)))

结果仍然是None:

Tm9uZQ==
None

我不明白为什么默认解码不起作用。

"Tm9uZQ=="是字符串"None",

base64编码
>>> from base64 import b64encode, b64decode
>>> s = b'None'
>>> 
>>> b64encode(s)
b'Tm9uZQ=='
>>> b64decode(b64encode(s))
b'None'
>>> 

您的某些数据可能丢失了。例如。 user.pk 未设置。我认为 force_bytes 正在将 None user.pk 转换为字节串 b'None',来自 Django 源,

def force_bytes(s, encoding='utf-8', strings_only=False, errors='strict'):
    """
    Similar to smart_bytes, except that lazy instances are resolved to
    strings, rather than kept as lazy objects.

    If strings_only is True, don't convert (some) non-string-like objects.
    """
    # Handle the common case first for performance reasons.
    if isinstance(s, bytes):
        if encoding == 'utf-8':
            return s
        else:
            return s.decode('utf-8', errors).encode(encoding, errors)
    if strings_only and is_protected_type(s):
        return s
    if isinstance(s, memoryview):
        return bytes(s)
    return str(s).encode(encoding, errors)

您可以通过在调用 force_bytes.

时设置 strings_only=True 来防止 None 变成 b'None'