运行Django runserver时出现405错误,寻求解决方法
Django 405错误(POST请求/password/reset/done/)解决方案
核心原因
/password/reset/done/ 对应的是密码重置请求提交后的结果展示页,Django默认的PasswordResetDoneView仅处理GET请求,发送POST请求自然会返回405方法不允许。
排查与修复步骤
1. 检查urls.py路由配置
确认你的/password/reset/done/路由绑定的视图:
- 如果使用Django自带的认证视图,代码应类似:
这里from django.contrib.auth import views as auth_views urlpatterns = [ # ... 其他路由 path('password/reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'), path('password/reset/', auth_views.PasswordResetView.as_view(), name='password_reset'), ]PasswordResetDoneView只响应GET请求,负责展示重置邮件已发送的提示,不需要处理POST。
2. 修正前端请求逻辑
你大概率是前端表单的action属性写错了:
- 用户提交密码重置请求的表单,应该把POST请求发送到
/password/reset/(对应PasswordResetView,负责处理重置逻辑),而非/password/reset/done/。 - 检查前端模板里的表单代码:
<!-- 错误示例:action指向了done页面 --> <form method="post" action="{% url 'password_reset_done' %}"> <!-- 正确示例:action指向reset页面 --> <form method="post" action="{% url 'password_reset' %}">
3. 自定义视图的特殊处理(如果是自行编写的views.py)
如果你自定义了password_reset_done视图:
- 若该页面不需要处理POST请求,明确限制允许的请求方法:
from django.http import HttpResponseNotAllowed from django.shortcuts import render def password_reset_done(request): if request.method != 'GET': return HttpResponseNotAllowed(['GET']) # 页面渲染逻辑 return render(request, 'your_template.html') - 若确实需要处理POST,在视图中添加对应的POST处理逻辑,但从业务逻辑看,done页面通常不需要接受POST。
4. settings.py排查(大概率无关,但可确认)
检查是否有自定义中间件修改了请求方法,或者CSRF配置导致请求异常,但日志明确是405,所以优先排查前面的步骤。
总结
90%以上的情况是前端请求发错了路由,把本该发给/password/reset/的POST请求发到了/password/reset/done/。先修正前端表单的action地址,再确认路由与视图的匹配关系即可解决。
内容的提问来源于stack exchange,提问作者Lunae_Blick
相关产品推荐
相关产品推荐

