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

时间:2021-12-15 21:30:10

I've encountered a problem where I had to load more than 200 new users into my django app and right away send them a password reset email. This had to happen only once, done only by me and run quietly on backend. Surfing the internet brought me only to one more or less right answer: Trigger password reset email in django without browser?. The only problem was is that this post was about 4 years old and of course when I tried the solution, it didn't work...

我遇到了一个问题,我不得不将超过200个新用户加载到我的django应用程序中,并立即向他们发送密码重置电子邮件。这必须只发生一次,只由我做,并在后端安静地运行。浏览互联网只给我一个或多或少的正确答案:在没有浏览器的情况下触发django中的密码重置电子邮件?唯一的问题是这篇文章大约4年了,当然当我尝试解决方案时,它没有用...

1 个解决方案

#1


Two most valuable points from the link I mentioned:
1) In more recent version of Django we need to call form.is_valid()
2) Sending of email is done upon save().

我提到的链接中最有价值的两点:1)在更新版本的Django中,我们需要调用form.is_valid()2)在save()时发送电子邮件。

Here is how I queried users that I needed and sent each of them a password reset link:

这是我如何查询我需要的用户并向他们发送密码重置链接:

    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

       users = User.objects.filter(date_joined__gt = '2015-04-16')
       for user in users:
       try:

        if user.email:
            log.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:
          log.info(e)
          continue

return 'done'

1) Usually PasswordResetForm works with a "request" from the front-end, which I didn't have. So I simply created one.
2) When I followed the example in the link, it failed.. It couldn't find server name in the request. (Makes sense because I instantiated my request out of nowhere)
3) When I fixed server name, it asked for the server port. Since I used https, my port is 443, otherwise use default port. 4) If you use https, don't forget to indicate it when you save the form (use_https=True)

1)通常PasswordResetForm使用来自前端的“请求”,这是我没有的。所以我只创建了一个。 2)当我跟踪链接中的示例时,它失败了..它在请求中找不到服务器名称。 (这是有道理的,因为我无处不在实例化我的请求)3)当我修复服务器名称时,它要求服务器端口。由于我使用https,我的端口是443,否则使用默认端口。 4)如果您使用https,请不要忘记在保存表单时指明它(use_https = True)

#1


Two most valuable points from the link I mentioned:
1) In more recent version of Django we need to call form.is_valid()
2) Sending of email is done upon save().

我提到的链接中最有价值的两点:1)在更新版本的Django中,我们需要调用form.is_valid()2)在save()时发送电子邮件。

Here is how I queried users that I needed and sent each of them a password reset link:

这是我如何查询我需要的用户并向他们发送密码重置链接:

    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

       users = User.objects.filter(date_joined__gt = '2015-04-16')
       for user in users:
       try:

        if user.email:
            log.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:
          log.info(e)
          continue

return 'done'

1) Usually PasswordResetForm works with a "request" from the front-end, which I didn't have. So I simply created one.
2) When I followed the example in the link, it failed.. It couldn't find server name in the request. (Makes sense because I instantiated my request out of nowhere)
3) When I fixed server name, it asked for the server port. Since I used https, my port is 443, otherwise use default port. 4) If you use https, don't forget to indicate it when you save the form (use_https=True)

1)通常PasswordResetForm使用来自前端的“请求”,这是我没有的。所以我只创建了一个。 2)当我跟踪链接中的示例时,它失败了..它在请求中找不到服务器名称。 (这是有道理的,因为我无处不在实例化我的请求)3)当我修复服务器名称时,它要求服务器端口。由于我使用https,我的端口是443,否则使用默认端口。 4)如果您使用https,请不要忘记在保存表单时指明它(use_https = True)