【问题标题】:URL not working with One-Time-TokenURL 不适用于一次性令牌
【发布时间】:2025-12-29 10:55:11
【问题描述】:

我正在尝试构建一个登录系统,用户在注册后需要点击一个链接和一封激活电子邮件。我在一个方法中创建令牌:

def get_context_data(
        self, request, user, context=None):
    if context is None:
        context = dict()
    current_site = get_current_site(request)
    if request.is_secure():
        protocol = 'https'
    else:
        protocol = 'http'
    token = token_generator.make_token(user)
    uid = urlsafe_base64_encode(
        force_bytes(user.pk))
    context.update({
        'domain': current_site.domain,
        'protocol': protocol,
        'site_name': current_site.name,
        'token': token,
        'uid': uid,
        'user': user,
    })
    return context

这里的问题是生成的token是这样的:

http://127.0.0.1:8000/user/activate/b'NjA'/4t8-9fad2c2dc78ecf8a1228/

该 URL 无效,因为 urlsafe_base64_encode(force_bytes(user.ok)) 生成一些在 url 中不起作用的奇怪字符组合。我收到以下错误。

找不到页面 (404) 请求方法:GET 请求网址:http://127.0.0.1:8000/user/activate/b&

如您所见,网址在#& 之后被截断。 如何以适用于 url 的方式对 user.pk 进行编码?

【问题讨论】:

    标签: django django-rest-framework token


    【解决方案1】:

    如果有人遇到同样的问题。问题是对 python 2.0 的更新

    这解决了它: Django 2, python 3.4 cannot decode urlsafe_base64_decode(uidb64)

    【讨论】: