2016-06-15 4 views
1

Я хочу прочитать в некоторых данных из файла, чтобы быстро создать множество тестовых учетных записей. Я бы предпочел использовать метод bulk_create, поскольку это, как правило, намного быстрее для добавления многих записей в модель. Однако при использовании метода bulk_create с моделью пользователя Django пароли не используются корректно, поэтому я не могу войти и выйти из системы как пользователь.Django 1.9 Bulk Создать новых пользователей Не хешировать пароли Правильно

User.objects.bulk_create([ 
     User(
      username=name, 
      email='[email protected]', 
      password='Sample&Password!', 
      is_active=True, 
     ) for name in f.read().splitlines() 
    ]) 

Django администратора показывает следующее сообщение об ошибке в поле пароля для каждого пользователя

Неверный формат пароля или неизвестный алгоритм хэширования.

Второй способ, однако, продолжает работать (хотя и значительно медленнее).

for name in f.read().splitlines(): 
     User.objects.create_user(
      name, 
      '[email protected]', 
      password="Sample&Password!" 
     ).save() 

Вопрос в том, есть ли способ правильно создать пользователей за один раз в Django. Действительно ли Django ведет себя так по причине или это ошибка?

ответ

3

Использование make_password. Это гарантирует, что хэшированные пароли будут сохранены в вашей базе данных. Если make_password слишком медленно, see this

from django.contrib.auth.hashers import make_password 

User.objects.bulk_create([ 
    User(
     username=name, 
     email='[email protected]', 
     password=make_password('Sample&Password!'), 
     is_active=True, 
    ) for name in f.read().splitlines() 
]) 
+0

Это фиксированная моя проблема, спасибо за быстрый ответ –

0

Это потому, что пароль зашифрованы в базе данных, и вы сохраните оригинал. Вам просто нужно использовать make_password, чтобы зашифровать его.

Пожалуйста, попробуйте:

from django.contrib.auth.hashers import make_password 

User.objects.bulk_create([ 
    User(
     username=name, 
     email='[email protected]', 
     password=make_password('Sample&Password!'), 
     is_active=True, 
    ) for name in f.read().splitlines() 
]) 
Смежные вопросы