web-dev-qa-db-ja.com

Django shellからユーザーを作成する方法

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を渡すことで]パスワードはプレーンテキストとして保存されます。 。

40
shifu

他の人が示唆しているように、通常の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()
99
Daniel Roseman

Djangoのスーパーユーザーを作成する最速の方法は、Shellを入力することです。

python manage.py createsuperuser
12

Djangoシェルでuser.set_passwordを使用してパスワードを設定します。 Djangoはパスワードのハッシュを予期するため、user.passwordを介してパスワードを直接設定しても機能するかどうかはわかりません。

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

スクリプトを自動化するには、パイプ機能を使用して、毎回入力することなくコマンドのリストを実行できます。

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

Windowを使用している場合、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
2
Du D.

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):
2
Zargold

ユーザーを作成するには、次を実行します。

$ python manage.py Shell
>>>> from Django.contrib.auth.models import User
>>>> user = User.objects.create_user('USERNAME', 'MAIL_NO_REQUIRED', 'PASSWORD')
0
Cubiczx