python - desde - django user model
Como crear un usuario desde la shell django. (7)
Hay dos formas de establecer una contraseña para un objeto de usuario django desde django-shell.
user = User(username="django", password = "secret")
user.save()
Esto almacenará la contraseña encriptada.
user = User(username="django")
user.set_password("secret")
user.save()
Esto almacenará la contraseña encriptada.
Pero,
user = User(username="django")
user.password="secret"
user.save()
Esto almacenará la contraseña de texto sin formato. No hay hashing / encriptaciones aplicadas ya que está modificando la propiedad directamente.
Cuando creo un usuario desde django-admin
las contraseñas de usuario están encriptadas. pero cuando creo un usuario desde django shell usuario-contraseña se guarda en texto plano. Ejemplo:
{
"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"
}
Estoy tratando de hacer una API de estilo REST para una aplicación de blog simple: cuando intento insertar un usuario por solicitud de publicación [al pasar JSON], la contraseña se guarda como texto sin formato. cómo anular este comportamiento.
La forma más rápida de crear un superusuario para django, escriba en shell:
python manage.py createsuperuser
No debe crear el usuario a través de la sintaxis de User(...)
normal User(...)
, agregue otros que hayan sugerido. Siempre debe usar User.objects.create_user()
, que se encarga de configurar la contraseña correctamente.
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()
Para automatizar el script, puede utilizar la función de canalización para ejecutar la lista de comandos sin tener que escribirla cada vez.
// 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()
Recuerde activar VirtualEnv primero, luego ejecute el siguiente comando (para Linux):
cat create_user.py | python manage.py shell
Si usa window, sustituya el comando cat con el comando type.
type create_user.py | python manage.py shell
O para Linux y 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
Para crear usuarios ejecutar:
$ python manage.py shell
>>>> from django.contrib.auth.models import User
>>>> user = User.objects.create_user(''USERNAME'', ''MAIL_NO_REQUIRED'', ''PASSWORD'')
Responda para aquellos que usan django 1.9 o superior, ya que from django.contrib.auth.models import User
ha sido desaprobado (posiblemente incluso antes) pero definitivamente por 1.9.
En su lugar haz: en bash:
python manage.py shell
En el shell de python para crear un usuario con una contraseña:
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 proviene de una API, probablemente debería aplicar un formulario como tal:
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):
Utiliza user.set_password
para establecer contraseñas en el shell de django. Ni siquiera estoy seguro de si la configuración directa de la contraseña a través de user.password
funcionaría, ya que Django espera un hash de la contraseña.
El campo de password
no almacena contraseñas; los almacena como <algorithm>$<iterations>$<salt>$<hash>
, así que cuando comprueba una contraseña, calcula el hash y lo compara. Dudo que el usuario realmente tenga una contraseña cuyo hash de contraseña calculado esté en el formulario <algorithm>$<iterations>$<salt>$<hash>
.
Si obtiene el json
con toda la información necesaria para crear el usuario, simplemente puede hacer
User.objects.create_user(**data)
Suponiendo que su json pasado se llama datos.
Nota: Esto generará un error si tiene elementos adicionales o faltantes en los data
.
Si realmente desea anular este comportamiento, puede hacerlo
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
No he probado esta solución, pero debería funcionar. Úselo bajo su propio riesgo.