Нет обратного совпадения при отображении шаблона электронной почты с переменной uid/токена

#django #django-urls

Вопрос:

Я написал представление для регистрации пользователя, включая проверку электронной почты. Однако, как только представление попытается отобразить шаблон почты, оно сломается из-за приведенной ниже ошибки.

Я даже не понимаю саму ошибку. Мы были бы признательны за понимание. Согласно некоторым поискам в Гугле, может быть, uid это не строка?

NoReverseMatch в /регистрация/ Обратный для «активировать» с аргументами ключевого слова » {«uidb64»: «MTE», «токен»: «asnwwr-550108ae10aa04da212561866c8d1ae3″}» не найден. 1 шаблон(ы) попробовал: [‘активировать/(?P[0-9A-Za-z_-] )/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$’]

Шаблон почты

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

Please click on the link below to confirm your registration:

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

Вид

 def signup(request):
    if request.method == 'POST':
        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 Poller Account'
            message = render_to_string('userprofile/account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),   # Issue might sit here?
                'token': account_activation_token.make_token(user),
            })
            user.email_user(subject, message)
            return redirect('account_activation_sent')
 

Знак

 from django.contrib.auth.tokens import PasswordResetTokenGenerator
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.email_confirmed)
        )

account_activation_token = AccountActivationTokenGenerator()
 

URL-адрес

 url(r'^account_activation_sent/


Комментарии:

1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла

2. @shahbazahmad сделал спасибо

Ответ №1:

Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:

 r'^activate/(?P<uidb64>[0-9A-Za-z_-] )/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,32})/


Комментарии:

1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?

2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?

3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!

, signup_views.account_activation_sent, name='account_activation_sent'),
url(r'^activate/(?P<uidb64>[0-9A-Za-z_-] )/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/

Комментарии:

1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла

2. @shahbazahmad сделал спасибо

Ответ №1:

Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:


Комментарии:

1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?

2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?

3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!

, signup_views.activate, name='activate'),

Комментарии:

1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла

2. @shahbazahmad сделал спасибо

Ответ №1:

Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:


Комментарии:

1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?

2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?

3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!

# Change to 32 ^^

Комментарии:

1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?

2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?

3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!

, signup_views.account_activation_sent, name=’account_activation_sent’),
url(r’^activate/(?P<uidb64>[0-9A-Za-z_-] )/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/

Комментарии:

1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла

2. @shahbazahmad сделал спасибо

Ответ №1:

Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:


Комментарии:

1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?

2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?

3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!

, signup_views.activate, name=’activate’),

Комментарии:

1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла

2. @shahbazahmad сделал спасибо

Ответ №1:

Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:


Комментарии:

1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?

2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?

3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!