带有Django 2.0的关键字参数uidb64的NoReverseMatch [英] NoReverseMatch with keyword argument uidb64 with Django 2.0
问题描述
我不明白为什么我的代码不起作用。在此之前,但现在,当我运行服务器并进行测试时,代码不起作用。
I can't understand why my code doesn't work. Before it worked, but now, when I run the server and test, the code does not work.
用户注册时,我向他发送激活电子邮件,如下所示:
When the user is registering, I send him activation email, like this:
def send_activation_email(serializer, request, user):
current_site = get_current_site(request)
message = render_to_string('acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
mail_subject = 'Activate your blog account.'
to_email = serializer.data['email']
email = EmailMessage(mail_subject, message, to=[to_email])
email.send()
acc_active_email.html
{% autoescape off %}
Hi {{ user.username }},
Please click on the link to confirm your registration,
http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
和我的网址文件
.
.
url(r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
views.activate_account, name='activate'),
.
.
但我有此错误:
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'activate' with keyword arguments '{'uidb64': b'NDM', 'token': '4qz-8f770502bd8b02786da9'}' not found. 1 pattern(s) tried: ['activate/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$']
突出显示此行 http:// {{domain}} {%url'activate'uidb64 = uid token = token%}
推荐答案
在Django 2.0和2.1中,您应该在对base64进行uid编码后调用 decode()
进行转换到字符串:
In Django 2.0 and 2.1 you should call decode()
after base64 encoding the uid, to convert it to a string:
message = render_to_string('acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode(),
'token': account_activation_token.make_token(user),
})
请参见 Django 2.0发行说明以获取更多信息。
See the note in the Django 2.0 release notes for more info.
在Django 2.2+中, urlsafe_base64_encode
返回字符串,因此无需解码。
In Django 2.2+, urlsafe_base64_encode
returns a string, so there is no need to decode.
message = render_to_string('acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
应该可以编写与Django< 1.11、2.0-2.1和2.2+,方法是使用 force_text
。请注意以下内容未经测试。
It should be possible to write code that is compatible with Django < 1.11, 2.0-2.1, and 2.2+, by using force_text
. Note the following is untested.
from django.utils.encoding import force_text
message = render_to_string('acc_active_email.html', {
'user': user,
'domain': current_site.domain,
'uid': force_text(urlsafe_base64_encode(force_bytes(user.pk))),
'token': account_activation_token.make_token(user),
})
您可以删除 force_text
并在放弃对Django<的支持后使用第二个代码段。 2.2。
You can drop the force_text
and use the second code snippet once you drop support for Django < 2.2.
这篇关于带有Django 2.0的关键字参数uidb64的NoReverseMatch的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!