You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django新手咨询:DRF是否需手动实现密码重置/修改API?

关于DRF中忘记/修改密码功能的实现说明

结论:确实需要手动适配或实现,DRF没有提供开箱即用的REST风格密码管理端点

原因如下:

  • DRF的核心定位:DRF是Django的REST扩展框架,核心能力聚焦在API序列化、视图封装、认证/权限体系(如Token、Session认证),而非完整的用户账户管理流程。用户密码重置、修改这类功能,Django原生的django.contrib.auth模块已经提供了底层逻辑,但这些逻辑是为传统表单提交、HTML响应设计的,并非REST API风格。
  • 原生Django的局限:Django自带的PasswordResetView、PasswordChangeView等视图类,默认返回HTML页面或重定向,不符合REST API返回JSON数据的要求,因此需要基于DRF的视图类(如APIView)封装这些底层逻辑,适配成REST接口。
  • 灵活性优先的设计:不同项目的密码管理流程差异极大——比如有的需要邮箱验证码、有的用短信验证、有的要求二次身份校验,DRF如果提供固定实现会限制开发者的定制空间,因此选择让开发者根据自身需求手动实现或借助第三方包完成。

简单实现示例

1. 忘记密码(发送重置链接)

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth.forms import PasswordResetForm

class PasswordResetAPIView(APIView):
    def post(self, request):
        form = PasswordResetForm(request.data)
        if form.is_valid():
            form.save(
                request=request,
                use_https=request.is_secure(),
                email_template_name='registration/password_reset_email.html'
            )
            return Response({"detail": "密码重置邮件已发送"}, status=status.HTTP_200_OK)
        return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)

2. 修改密码(已登录用户)

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.contrib.auth import update_session_auth_hash

class PasswordChangeAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        user = request.user
        old_password = request.data.get('old_password')
        new_password = request.data.get('new_password')
        
        if not user.check_password(old_password):
            return Response({"detail": "旧密码错误"}, status=status.HTTP_400_BAD_REQUEST)
        
        user.set_password(new_password)
        user.save()
        update_session_auth_hash(request, user)  # 保持用户登录状态
        return Response({"detail": "密码修改成功"}, status=status.HTTP_200_OK)

内容的提问来源于stack exchange,提问作者lorenzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:21:07