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

如何在Python代码中获取Django的用户密码重置URL(非模板环境)

在Python代码中生成Django密码重置URL的方法

你可以借助Django内置工具类手动生成密码重置URL,无需依赖模板标签,具体实现如下:

1. 导入所需模块

先在代码开头引入这些Django内置工具:

from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.urls import reverse
# 若需生成带域名的绝对URL(邮件必须用绝对路径),还需引入:
from django.contrib.sites.models import Site

2. 生成URL核心参数

为目标用户生成两个关键参数:

  • uidb64:对用户ID做base64编码的字符串,用于URL安全传输用户标识
  • token:验证用户身份的加密令牌,由Django密码重置令牌生成器生成

3. 构建完整重置URL

根据是否有request对象,分两种场景处理:

场景一:在视图函数内(有request对象)

直接用request.build_absolute_uri()生成包含域名的绝对URL:

def myFunction(toEmail_, request):
    user = User.objects.get(email=toEmail_)
    
    # 生成参数
    uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
    token = PasswordResetTokenGenerator().make_token(user)
    
    # 反转路由并生成绝对URL
    reset_path = reverse('password_reset_confirm', kwargs={'uidb64': uidb64, 'token': token})
    resetUrl = request.build_absolute_uri(reset_path)
    
    emailText = "Hi, please reset your password on this url {}".format(resetUrl)
    # 发送邮件逻辑...

场景二:无request对象(如后台任务、脚本)

通过Site模型获取当前站点域名拼接绝对URL:

def myFunction(toEmail_):
    user = User.objects.get(email=toEmail_)
    
    # 生成参数
    uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
    token = PasswordResetTokenGenerator().make_token(user)
    
    # 反转路由并拼接域名
    reset_path = reverse('password_reset_confirm', kwargs={'uidb64': uidb64, 'token': token})
    site = Site.objects.get_current()
    resetUrl = f"https://{site.domain}{reset_path}"  # 根据实际部署调整http/https
    
    emailText = "Hi, please reset your password on this url {}".format(resetUrl)
    # 发送邮件逻辑...

注意事项

  • 确保项目URL配置中已正确定义password_reset_confirm路由名称
  • 令牌token基于用户密码哈希、最后登录时间生成,若用户在生成令牌后修改密码,令牌会直接失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:14:52