Django修改密码视图出现DisallowedRedirect错误
Django修改密码视图DisallowedRedirect错误解决办法
问题根源
你的代码存在两个核心问题:
- URL配置冲突:
urls.py中mudar_senha路径错误绑定了Django自带的PasswordChangeView,而非你自定义的views.mudar_senha。这导致你在自定义视图里写的重定向代码根本没被执行,实际生效的是自带视图错误配置的success_url。 - 自带视图success_url配置错误:你给
PasswordChangeView的success_url直接传了命名路由字符串'learningLogApp:index',Django会把这个字符串当成完整URL(比如解析成http://learningLogApp:index),触发了"Unsafe redirect to URL with protocol"的安全校验错误。
修复步骤
1. 修正URL路由配置
打开users/urls.py,把mudar_senha的路径改成绑定你的自定义视图:
urlpatterns = [ # 其他路由保持不变 path('mudar_senha/', views.mudar_senha, name='mudar_senha'), # 替换原来的PasswordChangeView ]
2. 确保自定义视图的重定向写法正确
在你的views.py里,以下两种写法都是正确的(任选其一即可),之前的问题是因为路由没指向这个视图,所以这些代码没生效:
# 写法1:使用redirect快捷函数 return redirect('users:perfil') # 写法2:使用HttpResponseRedirect + reverse from django.http import HttpResponseRedirect from django.urls import reverse return HttpResponseRedirect(reverse('users:perfil'))
错误写法避坑
你之前尝试的这些写法都是错误的,别再用:
sucess_url = reverse_lazy(request, 'users/perfil.html'):reverse_lazy不需要传request参数,且不能直接用模板路径当参数return reverse_lazy(...):reverse_lazy返回的是延迟解析对象,不能直接作为视图响应返回,必须包裹在HttpResponseRedirect或redirect里reverse_lazy(request, 'users:perfil'):多传了request参数,函数视图里用reverse就行,reverse_lazy主要用于类视图的属性配置
验证
修改后重新启动服务,测试修改密码流程:密码修改成功后会正常重定向到用户个人页面,不会再触发DisallowedRedirect错误。
内容的提问来源于stack exchange,提问作者1sefirot1
相关产品推荐
相关产品推荐

