Dies ist eine Erinnerung, als ich eine API mithilfe des Rest-Frameworks in Django implementierte und versuchte, eine Funktion zum Zurücksetzen des Benutzerkennworts zu implementieren. Django hat eine leistungsstarke Authentifizierungsfunktion namens "django.contrib.auth", aber diesmal war es eine API-Implementierung, daher war es nicht einfach. Es gab eine Bibliothek für die API django-rest-auth, daher werde ich diese verwenden. Masu
API
Es wird der Fluss von. Es ist ein allgemeiner Fluss Wenn Sie "django.contrib.auth" so wie es ist verwenden, können Sie es fast fertigstellen, indem Sie einfach die Vorlage festlegen. Diesmal wird jedoch ein API-Endpunkt erstellt, sodass wir die Bibliothek verwenden
Laut Dokumentation scheint es sich um eine Bibliothek zu handeln, die Benutzerregistrierung, An- / Abmelden, Kennwortänderung und Zurücksetzen durchführt. Es war praktisch, aber die Dokumentation war äußerst unfreundlich, so dass ich sie beim Lesen des Quellcodes implementiert habe.
Vorerst
pip install django-rest-auth
API Wenn Sie es der Bibliothek überlassen, fügen Sie die folgenden zwei Zeilen zu "urls.py" hinzu, und es wird funktionieren
urls.py
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^', include('django.contrib.auth.urls')),
Wenn dies unverändert bleibt, kann die E-Mail-Vorlage nicht festgelegt werden. Wenn Sie die Vorlage nicht festlegen, können Sie die Domäne der in der E-Mail beschriebenen URL nicht festlegen
Es scheint, dass Sie den Serializer von django-rest-auth überschreiben müssen, um ihn festzulegen Geben Sie "email_template_name" usw. in "get_email_options" an. Es scheint andere Elemente zu geben, die eingestellt werden können
serializers.py
from rest_auth.serializers import PasswordResetSerializer
class CustomPasswordResetSerializer(PasswordResetSerializer):
def get_email_options(self):
data = {
'email_template_name': 'email/password_reset.html',
'subject_template_name': 'email/password_reset_subject.txt',
}
return data
Die E-Mail-Vorlage enthält Django-Standardvorlage. schauen Sie bitte
Bitte wenden Sie sich mit {{protocol}}: // {{domain}}
an die Front-URL
django/django/contrib/admin/templates/registration/password_reset_email.html
{% load i18n %}{% autoescape off %}
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}
{% trans "Thanks for using our site!" %}
{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
{% endautoescape %}
Und passen Sie views.py
entsprechend an
Ich habe auf [hier] verwiesen (https://github.com/Tivix/django-rest-auth/blob/49ccfe92a9e691ac4224de7a878c87402181c09e/rest_auth/views.py#L132)
views.py
from rest_framework.generics import GenericAPIView
from user.serializers import CustomPasswordResetSerializer
class PasswordResetView(GenericAPIView):
permission_classes = (permissions.AllowAny,)
serializer_class = CustomPasswordResetSerializer
def post(self, request):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response('Password reset e-mail has been sent.', status=200)
return Response(serializer.errors, status=400)
Zum Schluss routen Sie diese Ansicht mit urls.py
(1. Zeile)
urls.py
url(r'^/password/reset/$', PasswordResetView.as_view()),
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^', include('django.contrib.auth.urls')),
Jetzt haben Sie zwei APIs
--/ password / reset /
: Zum Senden der E-Mail-Adresse
--/ rest-auth / password / reset / verify /
: Zum Senden des Passworts
Ich denke, es ist in Ordnung, es "django-rest-auth" zu überlassen, um Passwörter zu senden
Es scheint, dass auf der Vorderseite zwei Dinge vorzubereiten sind (bitte bereiten Sie auch die Übergangsquelle und das Übergangsziel usw. vor). Die in der Ansicht und der API zu registrierenden Inhalte lauten wie folgt
Erstellen Sie ein Formular zur Eingabe Ihrer E-Mail-Adresse
/password/reset/
Erstellen Sie zwei Formulare, um das Passwort einschließlich der Bestätigung einzugeben
/rest-auth/password/reset/confirm/
UID und Token geben die Zeichenfolge an, die in der in der E-Mail enthaltenen URL enthalten ist.
https://***/reset/{ uid }/{ token }/
Ich denke, es ist eine ziemlich aggressive Methode Ich frage mich, ob es einen besseren Weg gibt
Recommended Posts