Django: Как правильно использовать сигналы для автоматической отправки электронной почты пользователю c при создании новой учетной записи? - PullRequest
0 голосов
/ 25 марта 2020

РЕДАКТИРОВАТЬ:

кажется, что это не обычная практика, как мало ответов найдено на форумах ... но у меня будет больше 30 аккаунтов для создания, поэтому я хочу немного автоматизировать ...

Что вы думаете об этой стратегии:

  1. Я создаю пользователя / профиль без «пароля», используя скрипт, запущенный на postgresql database

  2. Когда я хочу активировать учетную запись и отправить электронное письмо, я запускаю другой сценарий, который обновит атрибут pro_con в моделях профиля -> Я получаю сигнал pre_save и обновляю атрибут пароля пользователя с помощью функции make_password ();

при этом в моем методе send_user_account у меня есть незашифрованный пароль для отправки по электронной почте

К сожалению, когда я пытаюсь соединиться с паролем, он не работает ...

def send_user_account(sender,instance,**kwargs):
    if not instance._state.adding and instance.pro_con == 1:
        user = User.objects.get(username=instance.user)
        temporary_password = user.username
        user.password = make_password(temporary_password)
        user.save()
        #send_mail(subject, message, email_from, recipient_list)

pre_save.connect(send_user_account, sender=Profile)

Я разрабатываю проект Django и использую Django Аутентификация

Я добавил модели профиля, связанные с моделями пользователей и сайтов

Я хочу использовать сигнал для автоматической отправки c электронной почты с именем пользователя и паролем (открытым текстом) пользователю при создании учетной записи

У меня много проблем:

  1. , поскольку пользователь связан с моделью сайта FK, атрибут сайта в профиле не может быть равен NULL; Я решил его на данный момент, добавив значение по умолчанию, но оно неудовлетворительно

  2. Экземпляр пользователя создается в два этапа: первое имя пользователя и пароль регистрируются, и если имя пользователя и пароль действительны, пользователь экземпляр создается, и во второй форме администратора мы можем установить другой атрибут и, в частности, адрес электронной почты -> в настоящее время сигнал post_save отправляется после регистрации имени пользователя и пароля; Я хотел бы, чтобы электронная почта отправлялась, когда экземпляр USer полностью зарегистрирован, потому что мне нужно, чтобы электронная почта была доступна ...

  3. При создании пароль кодируется pbkdf2 / sha256, поэтому kwargs ['instance '] .password вернуть зашифрованный пароль; Как я могу отправить незашифрованный пароль пользователя?

models.py

class Profile(SafeDeleteModel):
    _safedelete_policy = SOFT_DELETE_CASCADE
    pro_ide = models.AutoField(primary_key = True)
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    site = models.ForeignKey(Site,default=1, on_delete = models.CASCADE)
    ...

    class Meta:

        db_table = 'adm_pro'
        verbose_name_plural = 'Profils'
        ordering = ['pro_ide']

    def create_profile(sender,**kwargs):

        if kwargs['created']:
            user_profile = Profile.objects.create(user=kwargs['instance'])
            subject = 'User account'
            login = kwargs['instance'].username
            psw = kwargs['instance'].password
            message = 'Your login and password : '+login+'/'+psw
            email_from = 'Your account has been created'
            recipient_list = ['email@gmail.com'] *****to be recovered from User instance**
            email = send_mail(subject, message, email_from, recipient_list)

    post_save.connect(create_profile, sender=User)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...