【问题标题】:Django form for REST API password reset用于 REST API 密码重置的 Django 表单
【发布时间】:2019-01-08 04:39:49
【问题描述】:

我的情况:

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

我遵循的工作流程是:

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

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 表单,Django rest 支持表单是为了保持一些熟悉。您将享受美好时光,同时保持 API 仅返回 Json,同时您可以使用前端框架的表单库。

标签: django-rest-framework django-rest-auth django-rest-framework-jwt


【解决方案1】:

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

基本上,我没有意识到在 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 工作流

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 2012-07-18
    • 2019-05-25
    • 2020-05-21
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多