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.
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()
Le moyen le plus rapide de créer un super utilisateur pour Django, tapez Shell:
python manage.py createsuperuser
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.
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
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')
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):