Skip to main content
 首页 » 编程设计

python之如何以编程方式在 django 1.7.6 中触发密码重置电子邮件

2025年05月04日29傻小

我遇到了一个问题,我必须将 200 多个新用户加载到我的 Django 应用程序中,并立即向他们发送密码重置电子邮件。这必须只发生一次,只能由我完成并在后端安静地运行。网上冲浪只给我带来了一个或多或少的正确答案:Trigger password reset email in django without browser? .唯一的问题是这篇文章已有 4 年历史,当然当我尝试解决方案时,它没有用......

请您参考如下方法:

我提到的链接中最有值(value)的两点:

  1. 在最新版本的 Django 中,我们需要调用 form.is_valid()
  2. 电子邮件的发送在 save() 时完成。

以下是我查询所需用户并向他们每个人发送密码重置链接的方式:

def find_users_and_send_email(): 
    from django.http import HttpRequest 
    from django.contrib.auth.forms import PasswordResetForm 
    from django.contrib.auth.models import User 
    import logging 
    logger = logging.getLogger(__name__) 
     
    users = User.objects.filter(date_joined__gt = '2015-04-16') 
    for user in users: 
        try: 
            if user.email: 
                logger.info("Sending email for to this email:", user.email) 
                form = PasswordResetForm({'email': user.email}) 
                 
                assert form.is_valid() 
                request = HttpRequest() 
                request.META['SERVER_NAME'] = 'help.mydomain.com' 
                request.META['SERVER_PORT'] = '443' 
                form.save( 
                    request= request, 
                    use_https=True, 
                    from_email="username@gmail.com",  
                        email_template_name='registration/password_reset_email.html') 
 
        except Exception as e: 
            logger.warning(str(e)) 
            continue 
 
    return 'done' 
  1. 通常 PasswordResetForm 使用来自前端的“请求”,但我没有。所以我简单地创建了一个。
  2. 当我按照链接中的示例进行操作时,它失败了。它无法在请求中找到服务器名称。 (有道理,因为我凭空实例化了我的请求)
  3. 当我固定服务器名称时,它会询问服务器端口。由于我使用的是 https,所以我的端口是 443,否则使用默认端口。
  4. 如果您使用 https,请不要忘记在保存表单时注明 use_https=True