如何在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
相关产品推荐
相关产品推荐

