2016-04-30 6 views
2

Ich verwende eine Django REST Framework API, um von meinem AngularJS-Frontend zum Django-Backend zu kommunizieren, das wirklich gut funktioniert. Ich habe das super-hilfreiche django-rest-auth-Paket sowie deren optionale Registrierung installiert. Authentifizierung funktioniert, und Registrierung funktioniert meistens auch.Django REST Auth: Fehler Rendering Django-Allauth Vorlage nach Bestätigung der E-Mail

Mein Problem ist, dass der Bestätigungslink in der Bestätigungs-E-Mail, die an den neuen Benutzer gesendet wird, mir einen NoReverseMatch-Fehler gibt. Dank der django-rest-auth FAQ, weiß ich, dass die Bestätigung nicht standardmäßig funktioniert und überschrieben werden muss, aber ich habe gespiegelt, was das Poster von this Frage getan hat. Mein 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')), 
... 

und die genauen Fehler:

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

Das Plakat von this Frage scheint das gleiche Problem gehabt zu haben, obwohl ich verstehe nicht, wie die eine Antwort gilt, und es ist nicht akzeptiert, also bin ich mir nicht sicher, ob es überhaupt funktioniert.

EDIT:

Basierend auf dem ersten Kommentar unten, habe ich versucht, den URL-Namen zu account_email ändern. Dies führte immer noch zu einem Fehler, aber nach dem Fehler wieder zu lesen, erkennen ich, es während django-allauth Vorlage eines Standard macht geworfen, nachdem die allauth Ansicht, welche die Bestätigung behandelt hat:

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 %} 

Ich denke also, den Code, den ich verwenden, Das Problem mit dem verknüpften GitHub ist für die Bestätigungs-E-Mail korrekt. Dieser Fehler tritt beim Rendern der Vorlage auf, nachdem die Allauth-Ansicht die E-Mail-Adresse bestätigt. Ich würde erwarten, dass die URLs in den Zeilen 26-30 oben Teil des include('rest_auth.registration.urls') Sets sind, da die django-rest-auth Registrierungsoption django-allauth verwendet.

Ich bin mir nicht sicher, was ich tun müsste, damit diese URL funktioniert, wenn die allauth-Ansicht die Bestätigung korrekt verarbeitet. Ich könnte mich bei dieser Vermutung jedoch irren.

EDIT 2 nahm ich den Rat von einem Kommentar unten und alle URLs ausgedruckt:

jetzt
>>> 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.... 

Der NoReverseMatch Fehler macht Sinn, da die URL-Muster auf der allauth Ansicht bestätigen E-Mail einfach aren nicht anwesend.

ich in der verknüpften Frage Stackoverflow festgestellt, dass das Plakat als so die allauth Urls aufgenommen hatte:

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

Wenn ich diese Zeile hinzugefügt, es funktionierte!

+0

Ist es nicht nur ein Tippfehler? In eror sagt es: Reverse für 'account_email' und Sie haben dies in URL name = "account_confirm_email", können Sie versuchen, mit demselben Namen in URL? –

+0

Danke für die Idee - ich denke, es sollte "account_confirm_email" sein und dass diese NoReverseMatch von einer URL auf einer grundlegenden Django-Allauth-Vorlage kommt, die keine Umkehrung hat. Ich habe einige Details zum ursprünglichen Post hinzugefügt, der das alles beschreibt – dkhaupt

+1

Ich verstehe nicht, warum Sie den Fehler erhalten, aber ich kann eine andere Idee geben, dies zu debuggen, überprüfen Sie URL-Muster über den Befehl show_urls. Dieser Befehl ist verfügbar, wenn Sie [django-extenstions] installieren (http://django-extensions.readthedocs.io) –

Antwort

3

Um die letzte Bearbeitung oben zu wiederholen, war das Problem hier, dass ich versuchte, die django-allauth Standard-E-Mail-Bestätigungsvorlage zu verwenden, aber die allauth URLs nicht explizit enthalten.

Ich glaube nicht, dass Schritt erforderlich war, da django-rest-framework ‚s-Registrierung allauth verwendet, aber da die account_confirm_email Ansicht muss auf jeden Fall außer Kraft gesetzt werden, die Autoren dieses Pakets scheinen Benutzer zu erwarten, dass der Schlüssel zu /verify_email/ POST.

Zur Nutzung der E-Mail Bestätigung allauth Vorlage zu machen, sind folgende in urls.py:

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

Ich denke, dass ich dich liebe. Ich wollte Chaos anrichten. –

+0

Froh, dass es geholfen hat! Ich habe festgestellt, dass nicht viele meiner django-rest-auth-Fragen beantwortet werden, also versuche ich Antworten zu posten, wenn ich sie herausfinden sollte. – dkhaupt