Django Rest与React邮箱验证链接端口错误致404问题咨询
问题根源
你遇到的404错误本质是:邮件内的激活链接默认取Django服务自身的运行地址localhost:8000作为域名,但/activate/<uid>/<token>是React端配置的前端路由,Django后端没有注册这个路径的GET接口,请求直接打到后端自然找不到对应资源返回404。
解决方案
两种方案选其一即可,都能实现点击邮件链接直接走通激活流程。
方案1:直接修改激活链接的生成域名,让链接默认指向前端地址
这是改造成本最低、最符合前后端分离架构设计的方案:
- 如果你用
djoser做认证模块,直接在settings.py中添加以下配置,覆盖默认的站点域名配置:
# settings.py DJOSER = { "ACTIVATION_URL": "activate/{uid}/{token}", "DOMAIN": "localhost:3000", # 前端服务本地地址 "SITE_NAME": "你的站点名称", "PROTOCOL": "http" # 上线部署时改成https }
- 如果你用
django-allauth/dj-rest-auth做认证模块,在settings.py中添加:
# settings.py ACCOUNT_EMAIL_CONFIRMATION_URL = "http://localhost:3000/activate/"
- 如果你是自己实现的发信逻辑,不要用
request.build_absolute_uri()方法拼接激活链接(这个方法会自动读取当前后端服务的域名端口),直接手动以前端地址为前缀拼接uid和token即可。 - 如果你开启了Django自带的
sites框架,也可以直接登录admin后台,把默认站点的域名从localhost:8000改成localhost:3000,效果和上面的配置一致。
配置完成后重新触发注册发信,新邮件里的链接会直接指向3000端口的前端激活页,点击后和你手动改端口的效果完全一致,前端拿到链接里的uid、token参数后调用后端激活接口即可完成校验。
方案2:后端添加重定向规则,自动把激活路径请求跳转到前端
如果你不想修改现有发信逻辑,可以直接在后端加路由规则,把打到8000端口激活路径的请求自动重定向到前端同路径地址:
直接在项目根路由文件urls.py的最顶部添加重定向路由(优先级要高于其他原有路由):
from django.views.generic import RedirectView from django.contrib import admin from django.urls import path, include urlpatterns = [ # 激活路径重定向规则 path( "activate/<uidb64>/<token>", RedirectView.as_view(url="http://localhost:3000/activate/%(uidb64)s/%(token)s"), name="activate-redirect" ), # 以下是你原有的路由配置 path("admin/", admin.site.urls), path("api/", include("your_api_module.urls")), # ... 其他原有路由 ]
配置生效后,就算邮件里的链接是8000端口的,用户点击后后端会返回302重定向到3000端口的对应前端页面,全程不需要用户手动改地址,也能正常走通激活流程。
上线注意
本地开发调试完成后正式部署时,只需要把上述配置里的localhost:3000替换成你实际的前端线上域名,http替换为https即可,不需要改动其他业务逻辑。
内容的提问来源于stack exchange,提问作者Максим Тищук
相关产品推荐
相关产品推荐

