Подтвердить что ты не робот

Как создать пользователя из оболочки 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": "[email protected]",
    "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"
} 

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

4b9b3361

Ответ 1

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

[email protected]> 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()

Ответ 2

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

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

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

User.objects.create_user(**data)

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

Примечание. Это вызовет ошибку, если у вас есть дополнительные или отсутствующие элементы в 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

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

Ответ 3

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

python manage.py createsuperuser

Ответ 4

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

// 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 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

Ответ 5

Ответ для тех, кто использует 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):

Ответ 6

Есть несколько способов установить пароль для пользовательского объекта 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()

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