wake-up-neo.com

So erstellen Sie einen Benutzer aus der Django-Shell

Wenn ich Benutzer aus Django-admin Benutzerpasswörtern erstelle, werden diese verschlüsselt. Wenn ich jedoch einen Benutzer aus Django Shell erstellt, wird das Benutzer-Passwort in Klartext gespeichert . Beispiel:

{
    "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"
} 

Ich versuche, REST Stil-API für eine einfache Blog-App zu erstellen: Wenn ich versuche, einen Benutzer per Post-Request [durch Weitergeben von JSON] einzufügen, wird das Kennwort als Nur-Text gespeichert. __ Verhalten.

30
shifu

Sie sollten den Benutzer nicht über die normale User(...)-Syntax erstellen, wie von anderen vorgeschlagen. Sie sollten immer User.objects.create_user() verwenden, um das Passwort richtig einzustellen.

[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()
87
Daniel Roseman

Der schnellste Weg, Superuser für Django zu erstellen, geben Sie Shell ein:

python manage.py createsuperuser
6

Sie verwenden user.set_password, um Kennwörter in der Django-Shell festzulegen. Ich bin mir nicht mal sicher, ob das direkte Setzen des Passworts über user.password überhaupt funktionieren würde, da Django einen Hash des Passworts erwartet.

Das Feld password speichert keine Kennwörter. Sie speichert sie als <algorithm>$<iterations>$<salt>$<hash>. Wenn sie ein Kennwort überprüft, berechnet es den Hash und vergleicht ihn. Ich bezweifle, dass der Benutzer tatsächlich ein Passwort hat, dessen berechneter Passwort-Hash in <algorithm>$<iterations>$<salt>$<hash>-Form vorliegt.

Wenn Sie die json mit allen Informationen erhalten, die zur Erstellung des Benutzers erforderlich sind, können Sie dies einfach tun

User.objects.create_user(**data)

vorausgesetzt, Ihr bestandener Json heißt Daten.

Hinweis: Wenn data zusätzliche oder fehlende Elemente enthält, wird ein Fehler ausgegeben.

Wenn Sie dieses Verhalten wirklich überschreiben möchten, können Sie dies tun

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

Ich habe diese Lösung nicht getestet, sollte aber funktionieren. Benutzung auf eigene Gefahr.

3

Um das Skript zu automatisieren, können Sie die Pipe-Funktion verwenden, um die Befehlsliste auszuführen, ohne sie jedes Mal neu eingeben zu müssen.

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

Denken Sie daran, zuerst VirtualEnv zu aktivieren und dann den folgenden Befehl auszuführen (für Linux):

cat create_user.py | python manage.py Shell

Wenn Sie window verwenden, ersetzen Sie den Befehl cat durch den Befehl type

type create_user.py | python manage.py Shell

OR für Linux und 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.

Um Benutzer zu erstellen, führen Sie Folgendes aus:

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

Antwort für diejenigen, die Django 1.9 oder höher verwenden, da from Django.contrib.auth.models import User veraltet wurde (möglicherweise sogar früher), aber definitiv um 1,9.

Stattdessen: In Bash:

python manage.py Shell

In der Python-Shell erstellen Sie einen Benutzer mit einem Kennwort:

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

Wenn Sie von einer API kommen, sollten Sie wahrscheinlich ein Formular als solches anwenden:

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