readthedocs - Redirigir al usuario a otra url con la señal de inicio de sesión de django-allauth
django django allauth (3)
En general, no debe intentar poner esa lógica en un controlador de señales. ¿Qué pasa si hay varios manejadores que quieren dirigir en diferentes direcciones?
En su lugar, haga esto:
# settings.py:
ACCOUNT_ADAPTER = ''project.users.allauth.AccountAdapter''
# project/users/allauth.py:
class AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
return ''/some/url/''
Estoy usando Django-allauth para mi información de inicio de sesión / registro, por lo que cuando un usuario se registra (por primera vez) en mi sitio, lo estoy redirigiendo a /thanks/
page definiendo la configuración a continuación en el archivo settings.py
LOGIN_REDIRECT_URL = ''/ gracias /''
Pero cuando el usuario intentó iniciar sesión la próxima vez (si ya está registrado) debería redirigirlo a ''/dashboard/''
URL
Así que traté de alterar eso con Django-allauth signals
como las de abajo que no funcionan en absoluto.
@receiver(allauth.account.signals.user_logged_in)
def registered_user_login(sender, **kwargs):
instance = User.objects.get_by_natural_key(kwargs[''user''])
print instance.last_login==instance.date_joined,"??????????????????????????????"
if not instance.last_login==instance.date_joined:
return HttpResponseRedirect(reverse(''dashboard''))
Entonces, ¿alguien puede hacerme saber cómo redirigir a un usuario a /dashboard/
para el inicio de sesión normal? ¿Estoy haciendo algo mal en el código de señal anterior?
Editar
Después de algunas modificaciones de acuerdo con la siguiente respuesta de pennersr
, mi clase de AccountAdapter
ve a continuación
from allauth.account.adapter import DefaultAccountAdapter
# from django.contrib.auth.models import User
class AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
if request.user.last_login == request.user.date_joined:
return ''/registration/success/''
else:
return ''/dashboard/''
Pero aún así, ¿está redirigiendo al usuario a /dashboard/
, mi lógica para determinar la primera vez que el usuario está equivocado?
Los dos last_login
date_joined
last_login
y date_joined
siempre serán diferentes, aunque puede que solo sean unos pocos milisegundos. Este fragmento de código funciona:
# settings.py:
ACCOUNT_ADAPTER = ''yourapp.adapter.AccountAdapter''
# yourapp/adapter.py:
from allauth.account.adapter import DefaultAccountAdapter
from django.conf import settings
from django.shortcuts import resolve_url
from datetime import datetime, timedelta
class AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
threshold = 90 #seconds
assert request.user.is_authenticated()
if (request.user.last_login - request.user.date_joined).seconds < threshold:
url = ''/registration/success''
else:
url = settings.LOGIN_REDIRECT_URL
return resolve_url(url)
Una observación importante para la respuesta de pennersr: EVITA usar archivos llamados allauth.py ya que confundirá a Django y dará lugar a errores de importación .
Simplemente puede definir esas otras dos señales usando la señal user_logged_in como base. Un buen lugar para colocarlo es en signal.py dentro de una aplicación de cuentas , en caso de que tenga una, o en su aplicación principal . Solo recuerde importar a Signal.py en usted __init__.py .
from django.dispatch import receiver, Signal
pre_user_first_login = Signal(providing_args=[''request'', ''user''])
post_user_first_login = Signal(providing_args=[''request'', ''user''])
@receiver(user_logged_in)
def handle_user_login(sender, user, request, **kwargs):
first_login = user.last_login is None
if first_login:
pre_user_first_login.send(sender, user=user, request=request)
print ''user_logged_in''
if first_login:
post_user_first_login.send(sender, user=user, request=request)
@receiver(pre_user_first_login)
def handle_pre_user_first_login(sender, user, request, **kwargs):
print ''pre_user_first_login''
pass
@receiver(post_user_first_login)
def handle_post_user_first_login(sender, user, request, **kwargs):
print ''post_user_first_login''
pass