web-dev-qa-db-fra.com

Comment créer un utilisateur à partir du shell Django

Lorsque je crée un utilisateur à partir de Django-admin, le mot de passe de l'utilisateur est crypté. mais lorsque je crée un utilisateur à partir de Django Shell, mot de passe utilisateur est enregistré en texte brut . Exemple:

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

J'essaie de créer une api de style REST pour une application de blog simple. comportement.

30
shifu

Vous ne devez pas créer l'utilisateur avec la syntaxe normale User(...), comme d'autres l'ont suggéré. Vous devriez toujours utiliser User.objects.create_user(), qui s’occupe de définir le mot de passe correctement.

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

Le moyen le plus rapide de créer un super utilisateur pour Django, tapez Shell:

python manage.py createsuperuser
6
Adizbek Ergashev

Vous utilisez user.set_password pour définir les mots de passe dans le shell Django. Je ne suis même pas sûr que définir directement le mot de passe via user.password fonctionnerait, car Django attend un hachage du mot de passe.

Le champ password ne stocke pas les mots de passe; il les stocke sous la forme <algorithm>$<iterations>$<salt>$<hash>. Ainsi, lorsqu'il vérifie un mot de passe, il calcule le hachage et le compare. Je doute que l'utilisateur ait réellement un mot de passe dont le hash de mot de passe calculé est au format <algorithm>$<iterations>$<salt>$<hash>.

Si vous obtenez la json avec toutes les informations nécessaires à la création de l'utilisateur, vous pouvez simplement faire

User.objects.create_user(**data)

en supposant que votre JSON passé est appelé données.

Remarque: Cela provoquera une erreur si vous avez des éléments supplémentaires ou manquants dans data.

Si vous voulez vraiment remplacer ce comportement, vous pouvez le faire

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

Je n'ai pas testé cette solution, mais ça devrait marcher. À utiliser à vos risques et périls.

3
Snakes and Coffee

Pour automatiser le script, vous pouvez utiliser la fonction de canal pour exécuter la liste de commandes sans avoir à la saisir à chaque fois.

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

Réf: get_user_model ()

N'oubliez pas d'activer d'abord VirtualEnv, puis exécutez la commande ci-dessous (pour Linux):

cat create_user.py | python manage.py Shell

Si vous utilisez window, remplacez la commande cat par la commande type

type create_user.py | python manage.py Shell

OR pour Linux et 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.

Pour créer des utilisateurs, exécutez:

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

Répondez pour ceux qui utilisent Django 1.9 ou supérieur car from Django.contrib.auth.models import User est obsolète (peut-être même plus tôt) mais définitivement par 1.9.

Au lieu de cela, faites: In bash:

python manage.py Shell

Dans le shell python pour créer un utilisateur avec un mot de passe:

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

Si vous venez d'une API, vous devriez probablement appliquer un formulaire en tant que tel:

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