2011-02-17 12 views
5

Hola a todos ustedes personas útiles (y adiós personas no útiles: D). Intento crear un usuario en django (1.2.4) y luego iniciar sesión después de guardarlos. Mi problema es que obtengo NotImplementedError y estoy viendo el traceback que está siendo generado por django.contrib.auth.models.AnonymousUser. Aquí es parte de mi código de la vista:Problema de Django con la creación de usuario y luego iniciar sesión en

def signup(request): 
    if request.method == 'POST': # If the form has been submitted... 
     p = request.POST 
     if not request.user.is_authenticated(): 
      form = UserForm(request.POST) # A form bound to the POST data 
      if form.is_valid(): # All validation rules pass 
       # Process the data in form.cleaned_data 
       # ... 
       form.save() 
       user=authenticate(username=p['username'],password=p['password']) 
       login(request,user) 
       return HttpResponseRedirect('/') # Redirect after POST 

por lo que parece a mí que está intentando conectarse a un usuario anymouse en lugar de la que estoy autenticación, ¿cómo puedo superar esto?

Gracias P.S. Los usuarios se están creando en la base de datos, simplemente no los iniciará con este código.

Rastreo:

Medio Ambiente:
solicitud de método: Enviar
solicitud de URL: http://localhost:8000/signup/
Django Versión: 1.2.4
versión de Python: 2.6.1
Aplicaciones instaladas:
[ 'django.contrib.auth',
'django.contrib.contenttypes',
'', django.contrib.sessions
'', django.contrib.sites
'', django.contrib.messages
'django.contrib.admin',
'', django.contrib.admindocs
'', django_extensions
'REDACTED_APPs', Middleware instalada: ('django.middleware.common.CommonMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware' , 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.cont rib.messages.middleware.MessageMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware')

Traceback:  
File "/Library/Python/2.6/site-packages/django/core/handlers/base.py" in get_response  
    100.      response = callback(request, *callback_args, **callback_kwargs)  
File "REDACTED/views.py" in signup  
    19.     login(request,user)  
File "/Library/Python/2.6/site-packages/django/contrib/auth/__init__.py" in login  
    71.  user.save()  
File "/Library/Python/2.6/site-packages/django/contrib/auth/models.py" in save  
    430.   raise NotImplementedError  

Exception Type: NotImplementedError at /signup/  
Exception Value: 
+0

¡Por favor, publique la trazabilidad! – Wogan

Respuesta

6

Lo que creo que está sucediendo aquí es authenticate está volviendo None, por lo tanto, login está utilizando request.user (una AnonymousUser).

Parece que la información utilizada para crear al usuario es diferente a la que está pasando al authenticate. Verificaría que el usuario se esté guardando correctamente (especialmente la contraseña).

Editar: De otras respuestas veo que está utilizando un formulario de usuario personalizado. Debería usar django.contrib.auth.forms.UserCreationForm, es save() el método establecerá la contraseña correctamente.

El abajo no funciona sin configurar manualmente el atributo de back-end, más problemas de lo que vale la pena, dejó para la posteridad

La más fácil es saltarse el paso de autentificar aquí (que no añade nada importante)

user = UserForm.save() 
login(request, user) 
+0

Parcialmente a la derecha, regresa Ninguno. Probé tu solución y no funciona porque sin autenticarla no se obtiene información del programa aparentemente de acuerdo con los documentos "Calling authenticate() first Cuando estás registrando manualmente a un usuario, debes llamar a authenticate() antes usted invoca login(). authenticate() establece un atributo en el usuario que indica qué servidor de autenticación autenticó exitosamente a ese usuario (consulte la documentación de los back-end para obtener más información), y esta información se necesita más adelante durante el proceso de inicio de sesión ". – UserZer0

+0

Revisé mi respuesta un poco. – Wogan

+0

Gracias, las otras respuestas son buenas, pero UserCreationForm es definitivamente el camino a seguir. – UserZer0

3

No estoy seguro si va a ayudar, pero lo mejor es extraer campos de formulario como el siguiente:

username = form.cleaned_data['username'] 
password = form.cleaned_data['password'] 
hashed_password = hashlib.md5(password).hexdigest() 

user = authenticate(username=username, password=hashed_password) 
if user: 
    login(request, user) 
    return HttpResponseRedirect('/') 

De los usuarios que se han creado con su código actual, ¿puede autenticarlos en el sistema?

Aquí es una forma alternativa de crear y de inicio de sesión utilizando un formulario de acceso y crear el usuario de forma manual:

# forms.py 
from django import forms 


class LoginForm(forms.Form): 
    username = forms.CharField(max_length=20) 
    password = forms.CharField(widget=forms.PasswordInput) 


# views.py 
import hashlib 

username = form.cleaned_data['username'] 
password = form.cleaned_data['password'] 
hashed_password = hashlib.md5(password).hexdigest() 

# assuming username is unique 
User.objects.get_or_create(username=username, defaults={'password': hashed_password, 'is_active': True}) 

# If password doesn't work, try hashed_password next 
user = authenticate(username=username, password=password) 
if user: 
    login(request, user) 
    return HttpResponseRedirect('/') 
+0

Probado haciendo form.cleaned_data obtener el mismo error original. ¿Puede explicar otras formas de autenticar al usuario recién creado? Eso es lo que quiero saber. – UserZer0

+0

Está creando y autenticando esos usuarios pero el código está fallando. Con el nombre de usuario y la contraseña del nuevo usuario, ¿puede autenticarse en el sitio o el administrador? –

+0

¡GRACIAS, ahora estamos llegando a algún lado! Solo había revisado para ver si se habían creado indead, pero al tratar de iniciar sesión en el back-end me parece que tampoco se autentica allí. Así que miro la contraseña en el backend y veo que no los encripta automáticamente, por lo que ese es probablemente el problema. ¿Cómo debo cifrar la contraseña antes de guardar la forma de usuario? En este punto, debo señalar que UserForm es un formulario modelo que creé, si hay uno predeterminado, ¿qué debo importar para acceder a él? – UserZer0

3

Creación de un usuario con form.save() no es una buena manera ... porque, ya que las contraseñas se guardan en un formato hash, pasword establece mediante

user.passord = password 

simplemente escribe datos sin troceo a la base de datos de autenticación y Django no puede comprobar correctamente ... lo que necesita es:

username = form.cleaned_data['username'] 
password = form.cleaned_data['password'] 

user = User.objects.create(username=username) 
if password: 
    user.set_password(password) 
else: 
    user.set_unusable_password() 
user.save() 
Cuestiones relacionadas