Почему модуль 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.

Другие вопросы по тегам