Как создать пользователя из оболочки 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], пароль сохраняется как обычный текст.
как переопределить это поведение.
Ответы
Ответ 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()
В этом случае будет храниться текстовый пароль. Не применяется хеширование/шифрование, поскольку вы изменяете свойство напрямую.