Как создать пользователя из оболочки django

Когда я создаю пользователя из django-admin, пароль пользователя шифруется. но когда я создаю пользователя из оболочки django, пользовательский пароль сохраняется в виде обычного текста. Пример :

{
    "date_joined": "2013-08-28T04:22:56.322185",
    "email": "",
    "first_name": "",
    "id": 5,
    "is_active": true,
    "is_staff": false,
    "is_superuser": false,
    "last_login": "2013-08-28T04:22:56.322134",
    "last_name": "",
    "password": "pbkdf2_sha256$10000$iGKbck9CED0b$6hWrKYiMPNGKhcfPVGal2YP4LkuP3Qwem+2ydswWACk=",
    "resource_uri": "/api/v1/user/5/",
    "username": "user4"
},
{
    "date_joined": "2013-08-29T01:15:36.414887",
    "email": "test@ophio",
    "first_name": "",
    "id": 6,
    "is_active": true,
    "is_staff": true,
    "is_superuser": true,
    "last_login": "2013-08-29T01:15:36.414807",
    "last_name": "",
    "password": "123test",
    "resource_uri": "/api/v1/user/6/",
    "username": "test3"
} 

Я пытаюсь сделать API в стиле REST для простого приложения для блога: когда я пытаюсь вставить пользователя по почтовому запросу [путем передачи JSON], пароль сохраняется в виде обычного текста. как переопределить это поведение.


person shifu    schedule 29.08.2013    source источник
comment
Как вы помещаете json в БД?   -  person Snakes and Coffee    schedule 29.08.2013
comment
я использую django-tastypie.   -  person shifu    schedule 29.08.2013
comment
Отвечает ли это на ваш вопрос? Как создать пользователя в Django?   -  person gmagno    schedule 14.05.2021


Ответы (7)


Вы не должны создавать пользователя с помощью обычного синтаксиса User(...), как предлагали другие. Вы всегда должны использовать User.objects.create_user(), который позаботится о правильной установке пароля.

user@host> manage.py shell
>>> from django.contrib.auth.models import User
>>> user=User.objects.create_user('foo', password='bar')
>>> user.is_superuser=True
>>> user.is_staff=True
>>> user.save()
person Daniel Roseman    schedule 29.08.2013
comment
Я не вижу, как ваш полный вопрос противоречит моему ответу. Если вам нужно создать пользователя в коде, вы должны использовать User.objects.create_user(). - person Daniel Roseman; 29.08.2013
comment
И откуда берется этот волшебный объект User? H8, когда образцы кода даются без этого важного бита «импорт». django.contrib.auth.models - person Jamie Pate; 27.06.2014
comment
Документы для create_user(): документы .djangoproject.com/en/1.8/topics/auth/customizing/ - person guettli; 26.09.2015
comment
Это может быть уменьшено до from django.contrib.auth.models import User; User.objects.create_superuser('foo', password='bar'). - person amath; 09.02.2018
comment
Для создания обычного пользователя используйте этот лайнер User.objects.create_user(username='foo', password='bar', is_staff=True) - person rvernica; 21.03.2019
comment
Если вы определили своего собственного пользователя, вам нужно сделать from django.contrib.auth import get_user_model, а затем User = get_user_model() - person theQuestionMan; 04.12.2020
comment
у меня это не работает, на данный момент в 2:14 я получаю ошибку auth_user, поскольку ее не существует. пожалуйста помоги - person GD- Ganesh Deshmukh; 27.04.2021

Самый быстрый способ создания суперпользователя для django, введите в оболочке:

python manage.py createsuperuser
person Adizbek Ergashev    schedule 19.08.2017
comment
Есть ли способ сделать это не в интерактивном режиме? - person leeman24; 09.09.2019
comment
на самом деле это намного медленнее, чем набирать код!! - person Chandan Purohit; 12.11.2019
comment
@ChandanPurohit, вы не должны использовать его в коде, вы можете использовать эту команду для создания пользователя из терминала. - person Adizbek Ergashev; 12.11.2019

Чтобы автоматизировать сценарий, вы можете использовать функцию конвейера для выполнения списка команд без необходимости вводить его каждый раз.

// content of "create_user.py" file
from django.contrib.auth import get_user_model

# see ref. below
UserModel = get_user_model()

if not UserModel.objects.filter(username='foo').exists():
    user=UserModel.objects.create_user('foo', password='bar')
    user.is_superuser=True
    user.is_staff=True
    user.save()

Ссылка: get_user_model()

Не забудьте сначала активировать VirtualEnv, а затем выполнить команду ниже (для Linux):

cat create_user.py | python manage.py shell

Если вы используете окно, замените команду cat на команду type.

type create_user.py | python manage.py shell

ИЛИ для Linux и Windows

# if the script is not in the same path as manage.py, then you must 
#    specify the absolute path of the "create_user.py" 
python manage.py shell < create_user.py

Подводный камень: не включайте пустые строки ни в какие блоки, думайте об этом, как будто вы вставляете свой код в repl. Если у вас есть пустая строка в блоке, это не сработает.

person Du D.    schedule 10.11.2017

Вы используете user.set_password для установки паролей в оболочке django. Я даже не уверен, будет ли работать прямая установка пароля через user.password, так как Django ожидает хэш пароля.

Поле password не хранит пароли; он сохраняет их как <algorithm>$<iterations>$<salt>$<hash>, поэтому при проверке пароля он вычисляет хэш и сравнивает его. Я сомневаюсь, что у пользователя действительно есть пароль, расчетный хэш которого имеет форму <algorithm>$<iterations>$<salt>$<hash>.

Если вы получите json со всей информацией, необходимой для создания пользователя, вы можете просто сделать

User.objects.create_user(**data)

предполагая, что ваш переданный json называется data.

Примечание. Это вызовет ошибку, если у вас есть лишние или отсутствующие элементы в data.

Если вы действительно хотите переопределить это поведение, вы можете сделать

def override_setattr(self,name,value):
    if name == 'password':
        self.set_password(value)
    else:
        super().__setattr__(self,name,value) #or however super should be used for your version

User.__setattr__ = override_setattr

Я не тестировал это решение, но оно должно работать. Используйте на свой риск.

person Snakes and Coffee    schedule 29.08.2013
comment
возможно, мне нужно переопределить сохранение по умолчанию для пользователя, который это делает. - person shifu; 29.08.2013
comment
Я не думаю, что вы должны это делать, так как это объект пользователя по умолчанию (это означает, что если бы вы это сделали, это перевернуло бы всех остальных, использующих пользователя, если вы не создали подкласс). Что не так с использованием set_password? - person Snakes and Coffee; 29.08.2013
comment
извините, но я внес некоторые изменения в исходный вопрос, чтобы сделать его более связанным с тем, что я делаю. - person shifu; 29.08.2013

Ответ для тех, кто использует django 1.9 или выше, поскольку from django.contrib.auth.models import User устарел (возможно, даже раньше), но определенно к 1.9.

Вместо этого выполните: в bash:

python manage.py shell

В оболочке python для создания пользователя с паролем:

from django.apps import apps
User = apps.get_model('user', 'User')
me = User.objects.create(first_name='john', email='[email protected]') # other_info='other_info', etc.
me.set_password('WhateverIwant')  # this will be saved hashed and encrypted
me.save()

Если вы исходите из API, вам, вероятно, следует применить форму как таковую:

import json
User = get_model('User')
class UserEditForm(BaseModelForm):
        """This allows for validity checking..."""

        class Meta:
            model = User
            fields = [
                'first_name', 'password', 'last_name',
                'dob', # etc...
            ]
# collect the data from the API:
post_data = request.POST.dict()
data = {
'first_name': post_data['firstName'],
'last_name': post_data['firstName'],
'password': post_data['password'], etc.
}
dudette = User()  # (this is for create if its edit you can get the User by pk with User.objects.get(pk=kwargs.pk))
form = UserEditForm(data, request.FILES, instance=dudette)
if form.is_valid():
    dudette = form.save()
else:
    dudette = {'success': False, 'message': unicode(form.errors)}
return json.dumps(dudette.json())  # assumes you have a json serializer on the model called def json(self):
person Zargold    schedule 01.11.2016
comment
Обратите внимание, что официальные документы (docs.djangoproject.com/en /1.10/topics/auth/default/) импортировать модель пользователя из django.contrib.auth.models. Судя по вашим other_info kwargs, вы можете упомянуть, что в вашем примере используется пользовательская модель пользователя. - person Escher; 26.01.2017
comment
это было предназначено для целей иллюстрации, так как не стесняйтесь размещать здесь любую информацию, которая есть у вашей конкретной модели пользователя... но уверен, что если бы кто-то буквально имел other_info, это должна была бы быть пользовательская модель пользователя. - person Zargold; 26.01.2017

Для создания пользователей выполните:

$ python manage.py shell
>>>> from django.contrib.auth.models import User
>>>> user = User.objects.create_user('USERNAME', 'MAIL_NO_REQUIRED', 'PASSWORD')
person Cubiczx    schedule 02.03.2018

Есть несколько способов установить пароль для пользовательского объекта django из django-shell.

user = User(username="django", password = "secret")
user.save()

Это будет хранить зашифрованный пароль.

user = User(username="django")
user.set_password("secret")
user.save()

Это будет хранить зашифрованный пароль.

Но,

user = User(username="django")
user.password="secret"
user.save()

Это будет хранить простой текстовый пароль. Хеширование/шифрование не применяется, поскольку вы напрямую изменяете свойство.

person Rahul Tanwani    schedule 29.08.2013
comment
user = User(username="django", password = "secret") не будет работать так, как вы ожидаете. Пожалуйста, проверьте совет, прежде чем делиться им. - person Mark Henwood; 30.10.2013
comment
Эй, я просто пропустил вызов save() после первого оператора. Здесь что-то еще не так? - person Rahul Tanwani; 04.11.2013
comment
Ваши первый и третий примеры приводят к бесполезному объекту User. Единственными правильными способами установки паролей для объекта пользователя django являются: 1 — вызов set_password для существующего объекта пользователя 2 — создание объекта пользователя с помощью вспомогательной функции User.objects.create_user В обоих этих методах вы передаете пароль в той же форме, что и аутентифицирующий пользователь. введет его, гарантируя, что совпадение хэша будет работать при следующей попытке входа в систему. Если вы установите пароль, используя два других примера, пользователь никогда не сможет войти в систему, поскольку проверка хеширования никогда не пройдет. - person Mark Henwood; 06.11.2013
comment
Это правильно человек. Цель добавления этого примера заключалась в том, чтобы сообщить спрашивающему, когда мы можем ожидать простой текстовый пароль. Пожалуйста, прочитайте вопрос и посмотрите, имеет ли он смысл. - person Rahul Tanwani; 07.11.2013