Django REST auth:在确认电子邮件后错误呈现django-allauth模板

时间:2016-04-30 15:06:53

标签: django django-rest-framework django-allauth

我使用Django REST Framework API从我的AngularJS前端与Django后端进行通信,后端运行良好。我安装了超级有用的django-rest-auth软件包以及他们的可选注册添加。身份验证有效,注册也很有效。

我的问题是发送给新用户的确认电子邮件中的确认链接给我一个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问题的海报似乎有同样的问题,但我不明白这个答案是如何适用的,而且它不被接受,所以我不是确定它是否有效。

修改

根据下面的第一条评论,我尝试将网址名称更改为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正常工作。不过,我猜错了。

编辑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确认电子邮件视图上的网址格式根本不存在。

我在链接的StackOverflow问题中注意到,海报中包含了allauth网址:

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

当我添加这一行时,它有效!

1 个答案:

答案 0 :(得分:3)

回顾上面的最终修改,问题是我尝试使用django-allauth默认电子邮件确认模板,但未明确包含allauth网址。

由于django-rest-framework的注册选项使用allauth,我不认为该步骤是必需的,但由于account_confirm_email视图无论如何都必须被覆盖,因此作者该软件包似乎希望用户将密钥POST到/verify_email/

要使用allauth电子邮件确认模板,请在urls.py中添加以下内容:

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