簡體   English   中英

Django AllAuth - 如何手動發送重置密碼 email?

[英]Django AllAuth - How to manually send a reset-password email?

在我的應用程序中,我使用的是 Django Allauth。 我沒有任何用戶注冊表。 管理員將通過上傳包含用戶信息的 excel 文件來注冊用戶。 我已經完成了所有這些,並且通過自動生成密碼將用戶保存在用戶表中。 上傳用戶列表並將它們保存在數據庫中后,我想向每個用戶發送一個重置密碼 email。

在 allauth 中重置密碼,您首先需要 go 重置頁面account/password/reset/並鍵入您的 email。然后發送一個 email,指示您更改密碼account/password/reset/key/(?P<uidb36>[0-9A-Za-z]+)-(?P<key>.+)/

是否可以直接在應用程序內發送 email? url 包含一個我不知道如何生成的密鑰?! 或者有更好的方法嗎?

這是可能的。 我的解決方案實現了用戶模型post_save信號,以調用Allauth Password重置視圖,該視圖將向用戶發送電子郵件。 要考慮的第一件事就是讓用戶的電子郵件地址的管理員用戶創建形式強制性的(如解釋在這里 )。 然后使用此代碼:

from allauth.account.views import PasswordResetView

from django.conf import settings
from django.dispatch import receiver
from django.http import HttpRequest
from django.middleware.csrf import get_token


@receiver(models.signals.post_save, sender=settings.AUTH_USER_MODEL)
def send_reset_password_email(sender, instance, created, **kwargs):

    if created:

        # First create a post request to pass to the view
        request = HttpRequest()
        request.method = 'POST'

        # add the absolute url to be be included in email
        if settings.DEBUG:
            request.META['HTTP_HOST'] = '127.0.0.1:8000'
        else:
            request.META['HTTP_HOST'] = 'www.mysite.com'

        # pass the post form data
        request.POST = {
            'email': instance.email,
            'csrfmiddlewaretoken': get_token(HttpRequest())
        }
        PasswordResetView.as_view()(request)  # email will be sent!

您可以嘗試使用以下內容獲取特定用戶的URL:

from allauth.account.forms import EmailAwarePasswordResetTokenGenerator
from allauth.account.utils import user_pk_to_url_str

token_generator = EmailAwarePasswordResetTokenGenerator()
user = User.objects.get(email='example@example.com')
temp_key = token_generator.make_token(user)
path = reverse("account_reset_password_from_key", 
               kwargs=dict(uidb36=user_pk_to_url_str(user), key=temp_key))

根據@davecaputo 的回答,您還可以直接提交表單而不是創建和調用視圖:

from allauth.account.forms import ResetPasswordForm
from django.conf import settings
from django.http import HttpRequest


def send_password_reset(user: settings.AUTH_USER_MODEL):
    request = HttpRequest()
    request.user = user
    request.META["HTTP_HOST"] = "www.mysite.com"

    form = ResetPasswordForm({"email": user.email})
    if form.is_valid():
        form.save(request)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM