如何在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,完全不用重复造轮子:
- 在API应用的
urls.py中添加密码重置相关的URL:
# 在API应用urls.py的urlpatterns末尾添加 path('dj-rest-auth/password/reset/', include('dj_rest_auth.password_reset.urls')),
- 在项目
settings.py里配置邮件发送参数(比如EMAIL_BACKEND、EMAIL_HOST、EMAIL_PORT等),确保重置链接能正常发出去 - 前端调用
/api/dj-rest-auth/password/reset/接口,传入用户邮箱,后端会自动发送带重置链接的邮件 - 默认重置链接会跳转到Django原生页面,如果你要跳转到自己的前端重置页面,在
settings.py里加一行配置:
PASSWORD_RESET_CONFIRM_URL = 'https://你的前端域名/reset-password/{uidb64}/{token}/'
- 前端做好重置页面后,再调用
/api/dj-rest-auth/password/reset/confirm/接口完成密码重置
两种思路对比
- 复用Users的URL:快是快,但只适合前后端不分离的场景,不符合API的REST规范
- 用dj-rest-auth:完美适配前后端分离的API场景,返回标准JSON响应,不用自己写后端逻辑,推荐选这个,毕竟你已经在用dj-rest-auth了
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

