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

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

{
    "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_sha256000$iGKbck9CED0bhWrKYiMPNGKhcfPVGal2YP4LkuP3Qwem+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"
} 

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

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()

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

python manage.py createsuperuser

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

на


для автоматизации скрипта вы можете использовать функцию 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()

Ref:get_user_model()

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

cat create_user.py | python manage.py shell

если вы используете окно, затем заменить кошки С тип команда

type create_user.py | python manage.py shell

или для Linux и Окна

# 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

ответ для тех, кто использует 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='johnsemail@email.com') # 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):

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

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

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

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