with readthedocs latest allauth django django-signals django-allauth

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