7

Estoy usando djangoappengine. Cuando intento crear un nuevo usuario, autenticar a ese usuario e iniciar sesión, aparece el siguiente error AttributeError: 'AnonymousUser' object has no attribute 'backend'.Django App Engine: AttributeError: el objeto 'AnonymousUser' no tiene ningún atributo 'back-end'

Mi código es simple y se ve así:

user = User.objects.create_user(username, username, password) 
user.set_password(password) 
user.save() 

user = django.contrib.auth.authenticate(username=username, password=password) 
django.contrib.auth.login(request, user) 

solo me dan el siguiente error en la producción y sólo de vez en cuando:

web req_create: 'AnonymousUser' object has no attribute 'backend' 
Traceback (most recent call last): 
    File "/base/data/home/apps/s~XXXXX/1.356802202883392818/XXXX/XXX.py", line 332, in req_create 
    login(request, user) 
    File "/base/data/home/apps/s~XXXXX/1.356802202883392818/django/contrib/auth/__init__.py", line 82, in login 
    request.session[BACKEND_SESSION_KEY] = user.backend 
AttributeError: 'AnonymousUser' object has no attribute 'backend' 

no estoy seguro, pero tengo una mala sensación de que esta excepción se debe al alto almacén de datos de replicación y su consistencia eventual. Creo que authenticate() guarda el valor del usuario y que login() hace una consulta, pero el valor del usuario aún no se ha propagado al HRDS. ¿Alguien puede confirmar que esto es cierto? Si es así, ¿cómo se solucionaría?

+0

Pasa el error original con traceback. – Nilesh

+0

Se agregó el rastreo. – speedplane

Respuesta

3

Al guardar al usuario, no se activará automáticamente. Por favor, consulte el enlace para AnonymousUser que dice cómo su usuario se convierte en AnonymousUser.

Así que debe configurar todos los elementos que pueden hacer que su usuario sea AnonymousUser. Antes de autenticar, marque user.is_anonymous().

+0

No lo creo. Como puede ver en el código anterior, creo el usuario y lo autentico antes de intentar iniciar sesión. No debe ser un usuario anónimo. – speedplane

+0

sí, pero compruebe el 'is_anonymous()'. Cuando crea el usuario, no se activará automáticamente, así que asegúrese de que 'is_anonymous()' devuelva 'False' y' is_authenticated() 'debe devolver' True'. – Nilesh

0

Eso sucede cuando el usuario no fue autenticado. Asegúrese de que está utilizando para el mismo campo loging backend ... por ejemplo yo soy loging con el correo electrónico (back-end que utiliza el correo electrónico y contraseña) para

django.contrib.auth.authenticate(username=username, password=password) 

si para mí

django.contrib.auth.authenticate(username=email, password=password) 

El backend es aquí: http://www.micahcarrick.com/django-email-authentication.html

0

Si está utilizando la replicación en su base de datos y está leyendo desde la réplica de Read mientras escribe en su base de datos maestra/predeterminada, entonces si hay un retraso de replicación que también podría causar esto. Escribirá en el maestro mientras que authenticate intentará leer desde la réplica de lectura, lo que ocasionará que no se encuentre el usuario.

La solución es configurar sus enrutadores para usar el DB predeterminado para las consultas del Usuario.

Cuestiones relacionadas