Ceci est un rappel lorsque j'ai implémenté l'API en utilisant le framework rest dans Django et que j'ai essayé d'implémenter la fonction de réinitialisation du mot de passe utilisateur.
Django a une puissante fonction d'authentification appelée django.contrib.auth
, mais cette fois c'était une implémentation d'API donc ce n'était pas facile.
Il y avait une bibliothèque pour l'API django-rest-auth, donc je vais continuer à l'utiliser. Masu
API --Recevoir une demande avec adresse e-mail
Cela devient le flux de. C'est un flux commun
Si vous utilisez django.contrib.auth
tel quel, vous pouvez presque le compléter simplement en définissant le modèle, mais cette fois, ce sera la création du point de terminaison de l'API, nous utiliserons donc la bibliothèque
Selon Documentation, il semble que ce soit une bibliothèque qui effectue l'enregistrement des utilisateurs, la connexion / déconnexion, le changement de mot de passe et la réinitialisation. C'était pratique, mais la documentation était extrêmement hostile, alors je l'ai implémentée en lisant le code source.
Pour le moment
pip install django-rest-auth
API Si vous le laissez à la bibliothèque, ajoutez les deux lignes suivantes à ʻurls.py` et cela fonctionnera
urls.py
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^', include('django.contrib.auth.urls')),
S'il est laissé tel quel, le modèle de courrier ne peut pas être défini. Si vous ne définissez pas le modèle, vous ne pouvez pas définir le domaine de l'URL décrite dans le courrier
Il semble que vous deviez remplacer le sérialiseur de django-rest-auth pour le définir
Spécifiez ʻemail_template_name etc. dans
get_email_options`. Il semble y avoir d'autres éléments qui peuvent être définis
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
Le modèle d'e-mail a modèle par défaut de django, veuillez donc vous y référer. regarde s'il te plait Veuillez diriger vers l'URL principale avec «{{protocol}}: // {{domain}}»
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 %}
Et ajustez views.py
en conséquence
J'ai fait référence à ici
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)
Enfin, acheminez cette vue avec ʻurls.py` (1ère ligne)
urls.py
url(r'^/password/reset/$', PasswordResetView.as_view()),
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^', include('django.contrib.auth.urls')),
Maintenant, vous avez deux API
--/ password / reset /
: Pour envoyer une adresse e-mail
--/ rest-auth / password / reset / confirm /
: Pour envoyer le mot de passe
Je pense que c'est correct de laisser django-rest-auth
pour l'envoi des mots de passe
Il semble qu'il y ait deux choses à préparer sur la face avant (veuillez également préparer la source et la destination de la transition, etc.) Les contenus à enregistrer dans la vue et l'API sont les suivants
Créez un formulaire pour saisir votre adresse e-mail
/password/reset/
Créez deux formulaires pour saisir le mot de passe, y compris la confirmation
/rest-auth/password/reset/confirm/
uid et token spécifient la chaîne de caractères incluse dans l'URL incluse dans l'e-mail.
https://***/reset/{ uid }/{ token }/
Je pense que c'est une méthode assez agressive Je me demande s'il y a une meilleure façon