Почему модуль Python Secrets продолжает генерировать одни и те же пароли в этой функции в Django
Вот функция:
def generate_password():
alphabet = string.ascii_letters + string.digits + "!@#$%^&*()+=/.,"
return ''.join(secrets.choice(alphabet) for i in range(12))
Я добавил это в модель Django, чтобы она автоматически вызывалась при создании пользователя и автоматически генерировала его пароль. Это код в модели:
password = models.CharField(max_length=100, default=generate_password())
По какой-то причине создание 4 пользователей всегда приводит к созданию как минимум одного дублирующегося пароля, если не двух.
это пример паролей, сгенерированных путем создания 7 пользователей:
PpN(ky^tabgP
@7sc
6#oNlIH0MbQg
6#oNlIH0MbQg
[электронная почта защищена][электронная почта защищена] @7sc
PpN(ky^tabgP
PpN(ky^tabgP)
Этот подход был предложен разными людьми и в документации, но кажется, что эта функция всегда циклически переключается между несколькими паролями и продолжает их повторять.
Может ли кто-нибудь помочь мне понять, почему и как этого избежать?
Django нужно перезапускать несколько раз, поэтому добавлять пароли в набор неудобно.
1 ответ
Проблема здесь.
password = models.CharField(max_length=100, default=generate_password())
Должно быть (без скобок )
пароль = models.CharField(max_length = 100, по умолчанию = generate_password )
потому что вам нужно передать вызываемый объект в качестве аргумента, и он будет вызываться django при каждом создании нового объекта.
Но это не относится к вашему текущему коду. Поскольку вы используете скобки()
, функцияgenerate_password
немедленно вызывается, и возвращаемое значение присваиваетсяdefault
.