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

Django生产环境邮箱验证链接访问返回404问题排查

问题根因

404是两个代码错误叠加导致的,和开发、生产环境差异无关:

  • 路由配置语法错误:使用path()定义路由时错误混用了正则语法,还写漏了正则分组的必填符号。path()默认用内置路径转换器匹配参数,不直接支持正则规则;如果要写正则路由,必须换用re_path(),且正则命名分组的正确格式是(?P<参数名>匹配规则),你写的(P<uidb64>...)漏了开头的?,根本无法识别路径参数。
  • 验证链接生成逻辑完全错误:你贴出的邮件链接里直接包含[0-9A-Za-z_\-]+、{1,13}这类正则表达式片段,说明拼接链接时没有传入实际生成的uidb64和token值,反而把路由里写的正则规则字符串直接拼到了链接中。开发环境能正常访问,是因为你当时复制的是控制台输出的正确链接,不是邮件里生成错误的链接。
修复步骤

1 修正路由配置

两种写法选一种即可:

方案A:使用path()+内置转换器(推荐,写法更简洁)

替换原有activate路由配置:

from django.urls import path
# 保留其他原有导入

urlpatterns = [
    # 保留其他原有路由
    path('activate/<str:uidb64>/<str:token>/', user_views.activate, name='activate'),
]

uidb64和token本身就是字母、数字、短横、下划线组成的字符串,默认的str转换器完全可以满足匹配需求,不需要手写复杂正则。

方案B:坚持使用正则匹配的话,换用re_path()并修正分组语法

from django.urls import re_path
# 保留其他原有导入

urlpatterns = [
    # 保留其他原有路由
    re_path(r'activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/',
         user_views.activate, name='activate'),
]

注意正则字符串前要加r标记为原生字符串,每个分组开头必须带?。

2 修正邮件验证链接生成逻辑

不要手动拼接字符串生成链接,用Django自带的reverse()函数基于路由名生成,从根源避免拼接错误:

from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.urls import reverse

# 以下代码放在注册处理视图中,给用户发邮件前调用
user = 当前新建的待激活用户对象
uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
token = default_token_generator.make_token(user)
# 生成路由相对路径
relative_link = reverse('activate', kwargs={'uidb64': uidb64, 'token': token})
# 替换为你生产环境的实际域名
verify_url = f"https://你的站点域名{relative_link}"
# 将verify_url传入邮件模板,替换原有错误链接

正确生成的链接格式类似https://example.com/activate/PMTI/Pb6ymqe-66b9346a42751b6d94e729b4050698ba/,不会出现任何正则表达式相关的特殊字符。

校验方式

修改完成后发送测试邮件,确认邮件内的链接没有[0-9]、+、{1,13}这类正则片段,点击链接即可正常走激活流程,不会再报404。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:33:19