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

如何在Django Rest Framework中实现密码重置?应关联哪个应用URL?

问题

我有一个名为API的应用,希望添加「忘记密码」按钮,允许用户输入邮箱后接收密码重置链接。同一个Django项目中,Users应用已经在后端实现了密码重置流程。

请问如何通过Django Rest Framework实现密码重置功能?是关联Users应用的URL,还是在API应用中新建URL?


现有代码

Users应用urls.py

app_name = 'users'
urlpatterns = [
    path('password/', user_views.change_password, name='change_password'),
    path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html', success_url=reverse_lazy('users:password_reset_done')), name='password_reset'),
    path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),name='password_reset_done'),
    path('password-reset-confirm/<uidb64>/<token>/',auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html',success_url=reverse_lazy('users:password_reset_complete')),name='password_reset_confirm'),
    path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'),name='password_reset_complete'),
]

主项目urls.py

urlpatterns = [
    path('', include('django.contrib.auth.urls')),
    path('admin/', admin.site.urls),
    path('api/', include('api.urls'), ),
    path('users/', include('users.urls'), ),
]

API应用urls.py

app_name = 'api'

router = routers.DefaultRouter()
router.register(r'users', UserViewSet, basename='user')

urlpatterns = [
    path('', include(router.urls)),
    path('dj-rest-auth/', include('dj_rest_auth.urls')),
    path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')),
    path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

解决方案

思路1:直接复用Users应用的现有URL

既然Users应用已经搭好了完整的密码重置流程,你可以直接在API端关联它的URL:

  • 前端「忘记密码」按钮的提交请求直接指向/users/password-reset/(对应Users应用的password_reset视图)
  • 注意:这种方式只适合前后端不分离的场景——因为Users应用的视图是返回HTML页面的;如果是纯API前后端分离的场景,这种方式无法返回JSON响应,体验会很差。

思路2:用DRF+dj-rest-auth实现API风格的密码重置

你的API应用已经集成了dj-rest-auth,这个库自带完整的密码重置API,完全不用重复造轮子:

  1. 在API应用的urls.py中添加密码重置相关的URL:
# 在API应用urls.py的urlpatterns末尾添加
path('dj-rest-auth/password/reset/', include('dj_rest_auth.password_reset.urls')),
  1. 在项目settings.py里配置邮件发送参数(比如EMAIL_BACKEND、EMAIL_HOST、EMAIL_PORT等),确保重置链接能正常发出去
  2. 前端调用/api/dj-rest-auth/password/reset/接口,传入用户邮箱,后端会自动发送带重置链接的邮件
  3. 默认重置链接会跳转到Django原生页面,如果你要跳转到自己的前端重置页面,在settings.py里加一行配置:
PASSWORD_RESET_CONFIRM_URL = 'https://你的前端域名/reset-password/{uidb64}/{token}/'
  1. 前端做好重置页面后,再调用/api/dj-rest-auth/password/reset/confirm/接口完成密码重置

两种思路对比

  • 复用Users的URL:快是快,但只适合前后端不分离的场景,不符合API的REST规范
  • 用dj-rest-auth:完美适配前后端分离的API场景,返回标准JSON响应,不用自己写后端逻辑,推荐选这个,毕竟你已经在用dj-rest-auth了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:03:36