2016-04-30 39 views
2

我正在使用Django REST框架API从我的AngularJS前端与Django后端进行通信,这非常有效。我安装了超级有用的django-rest-auth软件包以及它们的可选注册附件。身份验证的作品,并且大多数注册也可以。Django REST身份验证:错误呈现电子邮件确认后的django-allauth模板

我的问题是发送给新用户的确认电子邮件中的确认链接给我一个NoReverseMatch错误。感谢django-rest-auth FAQ,我知道这个确认在默认情况下不起作用,并且需要重写,但是我反映了this问题的发布者做了什么。我的网址:

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问题的海报似乎也有同样的问题,但我不明白的一个答案如何适用,它不是接受,所以我不确定它是否可行。

编辑

基于第一注释下,我试图改变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视图确认电子邮件地址之后呈现模板期间发生此错误。我希望上面第26-30行的URL是include('rest_auth.registration.urls')集合的一部分,因为django-rest-auth注册选项使用django-allauth。

我不确定如果allauth视图正确处理确认,我需要做些什么来获取此URL。尽管如此,我猜可能是错误的。

EDIT 2 我从下面的注释了意见,并打印出来的所有网址:

>>> 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错误是有道理的,现在,因为在allauth确认邮件视图只是AREN URL模式不在场。

我在链接的StackOverflow问题注意到,海报已列入allauth网址,像这样:

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

当我加入这行,它的工作!

+0

是不是只是一个错字?在eror中,它表示:对于'account_email'是相反的,并且您在url name =“account_confirm_email”中有这个名称,您可以尝试在url中使用相同的名称吗? –

+0

感谢您的想法 - 我认为它应该是'account_confirm_email',并且这个NoReverseMatch来自一个基本的django-allauth模板上的URL,它没有反转。我在原文中增加了一些细节,概述了所有这些 – dkhaupt

+1

我不明白你为什么会得到这个错误,但我可以给出其他的想法来调试这个,通过show_urls命令检查url模式。如果你安装了[django-extenstions](http://django-extensions.readthedocs.io) –

回答

3

要回顾上面的最终编辑,这里的问题是我试图使用django-allauth默认电子邮件确认模板,但没有明确包含allauth的URL。

没想到被要求的步骤,因为django-rest-framework的注册选项使用allauth,但自从account_confirm_email观点无论如何必须重写,那个包的作者似乎期望用户发布的关键/verify_email/

为了使用allauth电子邮件确认模板,包括urls.py如下:

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

我认为我爱你。我即将肆虐。 –

+0

很高兴帮助!我发现我的django-rest-auth问题中没有很多得到解答,所以如果我找出答案,我会尽量发布答案。 – dkhaupt