2

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

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

所以,它很好用,它返回类似“Tm9uZQ”的东西

然后,当我尝试解码它时,使用force_text(urlsafe_base64_decode(uidb64)) 它返回 None。

下一个字符串

urlsafe_base64_decode(uidb64)

还有,返回b'None'

我试图用谷歌搜索它,并看到不同的实现,但复制粘贴代码不起作用。

我写了类似的东西

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

结果仍然没有:

Tm9uZQ==
None

我不明白默认解码如何不起作用。

4

1 回答 1

4

"Tm9uZQ=="base64字符串的编码"None"

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

您的某些数据可能丢失。例如 user.pk 没有设置。我认为这force_bytes是从 Django 源代码中将 aNone user.pk变成 bytestring b'None'

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)

你或许可以通过调用时的设置来防止None变成。b'None'strings_only=Trueforce_bytes

于 2019-11-21T17:32:33.323 回答