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

Django项目重发OTP功能点击后报404错误如何解决

错误原因

URL的查询参数(?后面的内容)不会参与Django的路由匹配,所以用户名中的特殊字符编码后不会导致404,问题完全出在/user/resendOTP这部分路径和配置的路由不匹配,常见原因有3种:

  • 路由前缀不匹配:如果你把path('resendOTP', resend_otp)写在了项目根urls.py中,那该接口的实际访问路径是/resendOTP,而你AJAX请求的路径是/user/resendOTP,多了/user前缀,自然匹配不到路由返回404。
  • 路由末尾斜杠不匹配:如果该路由是配置在user应用的urls.py中,且根urls.py引入时加了user/前缀,那要看你路由的写法:如果写的是path('resendOTP/', resend_otp),就要求请求路径末尾必须带斜杠,你AJAX请求的/user/resendOTP不带斜杠,如果Django的APPEND_SLASH配置被设为False,就会直接返回404。
  • 小概率场景:user应用的urls.py没有被正确引入到根urls.py中,导致所有/user/开头的路径都匹配不到。
修复方案
  1. 先核对路由配置位置
    • 如果接口路由写在项目根urls.py:把AJAX请求的url改成/resendOTP,或者给根路由的path加前缀改成path('user/resendOTP', resend_otp)。
    • 如果接口路由写在user应用的urls.py:先确认根urls.py中已经正确引入了user的urls,示例根urls配置:
    from django.urls import include, path
    urlpatterns = [
        # 其他路由
        path('user/', include('user.urls')),
    ]
    
  2. 统一路由斜杠规则
    推荐给Django路由统一加末尾斜杠,修改user应用下的urls.py配置:
from .views import resend_otp
path('resendOTP/', resend_otp) # 末尾加斜杠

同时修改AJAX请求的url,加上末尾斜杠:

$.ajax({
    type: 'GET',
    url: '/user/resendOTP/', // 末尾加斜杠
    data: {usr:username},
    success: function(data){
        mess.innerText = data;
    }
})
  1. 额外优化建议
    避免硬编码路径,在模板中用Django的url模板标签生成路径,比如给路由加name属性:
# urls.py
path('resendOTP/', resend_otp, name='resend_otp')

然后在模板中把路径传给JS:

<a class="resend-otp" href="#" 
   onclick="ReSendOTP('{{user.username}}', 'resendOTPmess', '{% url 'resend_otp' %}')" >
   <i id="resendOTPmess">Resend</i>OTP?
</a>

JS里直接用传进来的路径即可,避免后续改路由导致路径不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:51:03