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/开头的路径都匹配不到。
修复方案
- 先核对路由配置位置
- 如果接口路由写在项目根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')), ] - 如果接口路由写在项目根urls.py:把AJAX请求的url改成
- 统一路由斜杠规则
推荐给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; } })
- 额外优化建议
避免硬编码路径,在模板中用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
相关产品推荐
相关产品推荐

