使用django allauth登录信号将用户重定向到另一个url
我正在使用Django allauth进行我的登录/注册相关的东西,因此当用户(第一次)注册到我的网站时,我通过在使用django allauth登录信号将用户重定向到另一个url,django,django-signals,django-allauth,Django,Django Signals,Django Allauth,我正在使用Django allauth进行我的登录/注册相关的东西,因此当用户(第一次)注册到我的网站时,我通过在settings.py文件中定义以下设置,将其重定向到/thanky/页面 登录\u重定向\u URL='/Thank/' 但是当用户下次尝试登录时(如果已经注册),我应该将他重定向到'/dashboard/'URL 所以我试着用下面这种根本不起作用的Django allauth信号来改变这一点 @receiver(allauth.account.signals.user_logge
settings.py
文件中定义以下设置,将其重定向到/thanky/
页面
登录\u重定向\u URL='/Thank/'
但是当用户下次尝试登录时(如果已经注册),我应该将他重定向到'/dashboard/'
URL
所以我试着用下面这种根本不起作用的Django allauth信号来改变这一点
@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'))
因此,任何人都可以让我知道如何将用户重定向到/dashboard/
进行正常登录,我在上述信号代码中是否有任何错误
编辑
根据下面由pennersr
给出的答案进行一些修改后,我的AccountAdapter
类如下所示
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/'
但是,它仍然会将用户重定向到
/dashboard/
,这是我判断第一次用户错误的逻辑?一般来说,您不应该尝试将此类逻辑放入信号处理程序中。如果有多个操纵器想要转向不同的方向,该怎么办
相反,请执行以下操作:
# 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/'
最后一次登录的日期时间和加入的日期时间总是不同的,尽管可能只有几毫秒。此代码段适用于:
# 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)
#settings.py:
ACCOUNT\u ADAPTER='yourapp.ADAPTER.AccountAdapter'
#yourapp/adapter.py:
从allauth.account.adapter导入DefaultAccountAdapter
从django.conf导入设置
从django.shortcuts导入解析url
从datetime导入datetime,timedelta
类AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(自我,请求):
阈值=90秒
断言请求。用户。是否经过身份验证()
if(request.user.last_login-request.user.date_加入)。秒<阈值:
url=“/注册/成功”
其他:
url=settings.LOGIN\u REDIRECT\u url
返回解析url(url)
对pennersr回答:避免使用名为allauth.py的文件,因为这会混淆Django并导致导入错误您可以使用用户登录信号作为基础来定义这两个其他信号。如果你有一个账户应用程序,或者在你的核心应用程序中,一个放置它的好地方是signals.py。只需记住在您的\uuu init\uuu.py中导入signals.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'
@receiver(post_user_first_login)
def handle_post_user_first_login(sender, user, request, **kwargs):
print 'post_user_first_login'
这里的答案很简单,您不需要任何信号或覆盖
DefaultAccountAdapter
在settings.py
中,只需添加一个注册重定向\u url即可
ACCOUNT\u SIGNUP\u REDIRECT\u URL=“/thank/”
登录\u重定向\u URL=“/dashboard/”
谢谢pennersr,我已经编辑了上面的回复,你能帮我一下吗?我们还能为用户提供重新发送确认电子邮件的选项吗?如果未确认他何时注册?您是否尝试检查上次登录/加入日期的值?一旦用户尝试使用未经验证的电子邮件登录,就会自动重新发送确认电子邮件。请注意,为了防止邮件轰炸,这仅在登录尝试间隔3分钟左右时生效。请不要将新文件命名为“project/../allauth.py”,它将首先加载到您的路径中,并屏蔽整个allauth库,从而引发导入恐怖。@pennersr您是否介意帮助我解决此处列出的问题谢谢,那是helpful@user2292376我认为这里没有必要使用断言
,因为这是一个登录重定向,所以用户应该在调用时进行身份验证。但是,+1@DH1TW我相信这个解决方案不完全是防弹的。。。我刚刚意识到,如果用户尝试登录失败(密码错误),由于某种原因,request.user.last_login仍会更新,因此request.user.last_login!=request.user.date_已加入,甚至阈值都无法保存它。。你们有解决办法吗?