【问题标题】:Dango 2.2 Reverse for 'activate' with keyword argumentsDango 2.2 使用关键字参数反转“激活”
【发布时间】:2020-04-21 12:34:49
【问题描述】:

我在创建帐户并使用电子邮件中发送的链接激活帐户时遇到问题。该应用程序是用 Django 2.2 版编写的。

点击激活链接后,我收到一条消息:

Reverse for 'activate' with keyword arguments '{'uidb64': '', 'token': ''}' not found. 1 pattern(s) tried: ['activate/(?P<uidb64>[^/]+)/(?P<token>[^/]+)/$']

urls.py 中的代码

path('activate/<uidb64>/<token>/', account.activate, name='activate'),

views.py 中的代码,用于注册和激活链接的代码。注册就像 CBV,激活就像 FBV。

class Signup(View):
    def get(self, request):
        form = SignUpForm()
        return render(request, 'account/signup.html', {'form': form})

    def post(self, request):
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            subject = 'Activate your Spotted account'
            message = render_to_string('account/account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user)
            })
            user.email_user(subject, message)
            return redirect('account_activation_sent')
        return render(request, 'account/signup.html', {'form': form})


def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.profile.email_confirmed = True
        user.save()
        login(request, user)
        return render(request, 'account/account_activation_email.html')
    else:
        return render(request, 'account/account_activation_invalid.html')

在帐户/account_activation_email.html 中:

{% autoescape off %}
Hi {{ user.username }},

Please click on the link below to confirm your registration:

http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}

token.py

from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils import six


class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) + six.text_type(timestamp) +
            six.text_type(user.profile.email_confirmed)
        )


account_activation_token = AccountActivationTokenGenerator()

【问题讨论】:

  • 您没有将tokenuid 传递给模板的上下文。
  • @WillemVanOnsem 你的意思是在Signup 视图中?我还添加了我的令牌代码。
  • @Webdev 违规行是这一行:return render(request, 'account/account_activation_email.html')。第三个参数没有提供上下文,而您的模板需要 uidtoken 上下文变量。

标签: python django email path


【解决方案1】:

如果您使用的是 Django 3.1 或更高版本,则激活/密码重置机制使用 SHA-256 哈希算法来处理令牌。 你的正则表达式太严格了。 根据文档,您应该使用路径而不是 url,如下所示。

path('reset/<uidb64>/<token>/', ...)

path('activate/<uidb64>/<token>/', ...)

详情here

【讨论】:

  • 将网址从url(r'^activate/(?P&lt;uidb64&gt;[0-9A-Za-z_\-]+)/(?P&lt;token&gt;[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', views.activate, name='activate'), 转换为path('activate/&lt;uidb64&gt;/&lt;token&gt;/', ...) 后对我有用!谢谢!
【解决方案2】:

您必须将tokenuid 作为上下文传递给render

def activate(request, uidb64, token):
    ...

    context = {'uidb64':uidb64, 'token':token}
    return render(request, 'account/account_activation_email.html', context)

【讨论】:

  • 我确实像你写的那样,我得到了:NoReverseMatch at /activate/NDI/5cs-f8555868ee0450f1e551/ Reverse for 'activate' with keyword arguments '{'uidb64': '', 'token': '5cs-343d23055a574944bd69'}' not found. 1 pattern(s) tried: ['activate/(?P&lt;uidb64&gt;[-a-zA-Z0-9_]+)/(?P&lt;token&gt;[-a-zA-Z0-9_]+)/$']
【解决方案3】:

也有同样的问题,我认为与 url 正在寻找的类型存在冲突。为了改变这一点,我只是将 url 值更改为 string 或 string:UUID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 2020-02-18
    • 2019-10-03
    • 1970-01-01
    • 2020-08-12
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多