2016-04-30 3 views
2

Я использую API-интерфейс Django REST Framework для связи из моего интерфейса AngularJS с бэкэндом Django, который работает очень хорошо. Я установил супер полезный пакет django-rest-auth, а также добавила дополнительную регистрацию. Аутентификация работает, и регистрация в основном работает.Django REST auth: ошибка рендеринга django-allauth шаблон после подтверждения по электронной почте

Моя проблема заключается в том, что ссылка подтверждения в электронном письме с подтверждением, отправленном новому пользователю, дает мне ошибку NoReverseMatch. Благодаря django-rest-auth FAQ, я знаю, что подтверждение не работает по умолчанию и требует переопределения, но я отразил то, что сделал плакат this. Мои URLs:

from allauth.account.views import confirm_email as allauthemailconfirmation 
... 
url(r'^rest-auth/', include('rest_auth.urls')), 
url(r'^rest-auth/registration/account-confirm-email/(?P<key>\w+)/$', allauthemailconfirmation, name="account_confirm_email"), 
url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), 
... 

И точная ошибка:

NoReverseMatch at /rest-auth/registration/account-confirm-email/ahhuvpetqmcsd6hjlgrjuru11mwfkpk9sljmfbuprxwz8elnajabr84vusnmdw7r/ 
Reverse for 'account_email' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 

Плакат this вопрос, кажется, была такая же проблема, хотя я не понимаю, как применяется один ответ, и это не принято, поэтому я не уверен, что он даже работает.

EDIT:

На основе первого комментария ниже, я попытался изменить имя URL для account_email. Это по-прежнему приводит к ошибке, но после повторного прочтения ошибки, я понял, что это брошено во время визуализации шаблона по умолчанию django-allauth, после того, как вид allauth обработал подтверждение:

Error during template rendering 

In template C:\Python34\lib\site-packages\allauth\templates\base.html, error at line 26 
Reverse for 'account_email' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 
    16  <li>{{message}}</li> 
17  {% endfor %} 
18  </ul> 
19  </div> 
20  {% endif %} 
21 
22  <div> 
23  <strong>Menu:</strong> 
24  <ul> 
25  {% if user.is_authenticated %} 
26 
     <li><a href=" 
     {% url 'account_email' %} 
     ">Change E-mail</a></li> 


27  <li><a href="{% url 'account_logout' %}">Sign Out</a></li> 
28  {% else %} 
29  <li><a href="{% url 'account_login' %}">Sign In</a></li> 
30  <li><a href="{% url 'account_signup' %}">Sign Up</a></li> 
31  {% endif %} 
32  </ul> 
33  </div> 
34  {% block content %} 
35  {% endblock %} 
36  {% endblock %} 

Так что я думаю, что код я использовал из связанной проблемы github верен для письма с подтверждением, и эта ошибка возникает при визуализации шаблона после того, как allauth-представление подтверждает адрес электронной почты. Я ожидал бы, что URL-адреса в строках 26-30 выше будут частью набора include('rest_auth.registration.urls'), поскольку в параметре регистрации django-rest-auth используется django-allauth.

Я не уверен, что мне нужно сделать, чтобы этот URL работал, если представление allauth правильно обрабатывает подтверждение. Хотя я мог ошибаться в этом вопросе.

EDIT 2 Я взял совет от комментариев ниже и распечатал все URL-адрес:

>>> show_urls(urls.urlpatterns) 
^api/ 
    ^$ 
    ^\.(?P<format>[a-z0-9]+)/?$ 

    ....autogenerated viewset URLs.... 

^api-browse/ 
    ^login/$ 
    ^logout/$ 
^rest-auth/ 
    ^password/reset/$ 
    ^password/reset/confirm/$ 
    ^login/$ 
    ^logout/$ 
    ^user/$ 
    ^password/change/$ 
^rest-auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$ 
^rest-auth/registration/ 
    ^$ 
    ^verify-email/$ 
    ^account-confirm-email/(?P<key>\w+)/$ 
^$ 

....explicitly added URLs for custom viewset methods... 

^register/$ 
^login/$ 
^logout$ 
^admin/ 

    ....admin URLs.... 

Ошибка NoReverseMatch имеет смысл сейчас, так как шаблоны URL на allauth зрения подтверждения электронной почты просто Арен Нет.

я заметил в связанном StackOverflow вопрос о том, что плакат был включен в allauth URLs, как так:

url(r'^accounts/', include('allauth.urls')), 

Когда я добавил эту линию, это сработало!

+0

Разве это не опечатка? В режиме eror он говорит: Reverse для 'account_email', и у вас есть это в url name = "account_confirm_email", можете ли вы попробовать с тем же именем в url? –

+0

Спасибо за идею. Я думаю, что это должно быть 'account_confirm_email' и что этот NoReverseMatch происходит от URL-адреса на базовом шаблоне django-allauth, который не имеет обратного. Я добавил некоторые детали к исходному сообщению, изложив все это. – dkhaupt

+1

Я не понимаю, почему вы получили ошибку, но я могу дать другую идею, чтобы отладить это, проверить шаблоны url с помощью команды show_urls. Эта команда доступна, если вы устанавливаете [django-extenstions] (http://django-extensions.readthedocs.io) –

ответ

3

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

Я не думаю, что этот шаг был необходим, так как django-rest-framework «s варианта регистрации использует allauth, но поскольку account_confirm_email вид должен быть переопределен в любом случае, авторы этого пакета, кажется, ожидать, что пользователи POST ключа к /verify_email/.

Для использования шаблона подтверждения на allauth электронной почты, включают следующее urls.py:

url(r'^accounts/', include('allauth.urls')), 
+0

Я думаю, что я люблю тебя. Я собирался нанести ущерб. –

+0

Рад, что это помогло! Я обнаружил, что не многие ответы на мои вопросы о django-rest-auth получают ответы, поэтому я стараюсь публиковать ответы, если я когда-либо их выясню. – dkhaupt

Смежные вопросы