首页 > 解决方案 > 用于 REST API 密码重置的 Django 表单

问题描述

我的情况:

Django 应用程序 + 移动应用程序,使用 Django REST api 和 rest-auth。我想实现密码重置交易,在移动应用程序上启动。

我遵循的工作流程是:

1)从手机执行密码重置请求-> OK,没问题

2) Django 向用户发送电子邮件 -> 好的,没问题

3) 转到电子邮件链接页面并创建新密码 -> 好的,没问题 但是创建新密码的表单是 REST framework API 表单

问题

1) 我可以自定义这个表格吗?我不知道该怎么做,因为这个 URL 是可变的(带有 UID 和令牌)。有什么建议么?

2) 此工作流程是否合适,或者是否有更好的方法来管理重置密码工作流程?

在我的 URL 文件中,我有:

urlpatterns = [
    ...
    re_path(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]

我应该在这里创建一个自定义视图吗?

在 Django REST 文档中,它说 REST 框架适用于返回 API 样式响应和常规 HTML 页面。但我找不到一个合适的例子来帮助我解决我的问题。

标签: django-rest-frameworkdjango-rest-authdjango-rest-framework-jwt

解决方案


找到解决方案对于那些可能有同样问题的人:

基本上我没有意识到在 allauth 中有一个密码重置工作流程,另一个是通过 rest_auth 重置密码的工作流程,在电子邮件上使用的链接令牌有一些差异

allauth 中的工作流程可以满足我的需要(来自 rest_auth 的工作流程需要使用可浏览的 api 表单),只需要从来自 rest_auth 请求的初始请求启动它,我在 views.py 中使用此代码解决了该请求:

from rest_framework import status
from rest_framework.decorators import api_view, authentication_classes, 
permission_classes
from rest_framework.response import Response
from allauth.account.forms import ResetPasswordForm

@api_view(['POST'])    
@authentication_classes([])
@permission_classes([])
def recover_password(request):
    if request.data.get('email'):
        form = ResetPasswordForm({'email': request.data.get('email')})
        if form.is_valid():
            form.save(request)
            return Response('Email with instructions was sent to provided account', 
            status=status.HTTP_200_OK)
    return Response('Missing email', status=status.HTTP_400_BAD_REQUEST)

该函数接收电子邮件并启动 allauth 工作流


推荐阅读