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

运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:19