tutorial desde cero python django shell django-shell

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.