не удается аутентифицировать пользователя в django

#python #django

#python #django

Вопрос:

Я создаю ссылку для аутентификации, чтобы отправить пользователю электронное письмо, и это ошибка, которую я получаю: Reverse for 'activate' with keyword arguments '{'uidb64': 'MzA', 'token': 'a8o36j-51326a9d14c0ebf00a88a9a8c4983014'}' 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})/$']

urls.py:

 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, name='activate'),
  

строка из views.py:

 message = render_to_string('main/acc_active_email.html'
  

активировать функцию в views.py:

 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.save()
        login(request, user)
        return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
    else:
        return HttpResponse('Activation link is invalid!')
  

acc_active_email.html:

 {% autoescape off %}
Hi {{ user.username }},
Please click on the link to confirm your registration,
http://{{ domain }}{% url 'main:activate' uidb64=uid token=token %}
{% endautoescape %}
  

Теперь это может быть потому, что я скопировал это из статьи, которая обновляет более старую версию django. требуется любая помощь!

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

1. Последняя часть токена длиннее 20.

2. @KlausD. Не могли бы вы, пожалуйста, указать, где это находится? итак, я могу это исправить.

3. Найдите на этой странице 20 !

4. @KlausD. Измените URL?

5. @KlausD. вот так: url (r ‘^активировать/(?P<uidb64>[0-9A-Za-z_-] ) /(?P<токен>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,50})/$’, views.activate, name=’активировать’),

Ответ №1:

Из вашего urls.py

 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, name='activate'),
  

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

 [0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20}
  

Это означает, что он будет соответствовать строке из «1-13 буквенно-цифровых (английских) символов, за которыми следует тире, за которым следует 1-20 буквенно-цифровых символов». Если вы посмотрите на свой токен, a8o36j-51326a9d14c0ebf00a88a9a8c4983014 вы можете увидеть, что на самом деле он содержит 32 символа после тире. Итак, вам нужно заменить 20 на 32 .

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

Я попробовал reverse вызов, который вы описываете, и теперь он, кажется, работает.

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

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

1. Теперь я вижу, что КлаусД ответил на вопрос в комментариях, когда я писал. Надеюсь, это более длинное описание все равно немного помогло. Кроме того, вам, вероятно, следует использовать более «современную» функцию django re_path (которая url является просто псевдонимом для)